c++ - std::vector 在增长时是否调用交换函数?始终还是仅针对某些类型?

标签 c++ vector swap

据我所知,我可以使用 vector 的 vector (std::vector< std::vector<int> >),这将非常有效,因为在内部不会复制元素,而是交换元素,这要快得多,因为不包括复制内存缓冲区。我说得对吗?

什么时候std::vector究竟利用交换功能?我在 C++ standard 中找不到任何相关信息.它是否发生在缓冲区重新分配期间?

我做了一些测试来找出它,但我失败了。我的自定义数据类型的交换函数根本没有被调用。

编辑:这是我的 test program .

最佳答案

我没有链接来支持这种说法,但据我所知,随 Microsoft C++ 分发的 STL 实现使用一些内部非标准魔术注释来标记 vector (和其他 STL 集合)作为 having-performant-swap 所以 vector<vector<>>不会复制内部 vector 但会交换它们。直到 VC9,也就是说,在 VC10 中,它们将切换到右值引用。我认为您不应该能够以相同的方式标记您自己的类,因为没有交叉编译器的方法可以做到这一点,并且您的代码只能在特定的编译器版本上工作。

编辑:我快速浏览了 <vector> VC9 中的 header 并找到了这个:

    // vector implements a performant swap
template <class _Ty, class _Ax>
    class _Move_operation_category<vector<_Ty, _Ax> >
    {
    public:
        typedef _Swap_move_tag _Move_cat;
    };

只是为了实验,你可以尝试为你自己的类型专门化这个类,但正如我所说,这是特定于 STL 版本的,它将在 VC10 中消失

关于c++ - std::vector 在增长时是否调用交换函数?始终还是仅针对某些类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2378179/

相关文章:

c++ - 我应该删除一个取消引用的指针数组吗?

c++ - 链表/vector 中的指针

c++ - 成员函数交换背后的基本原理

java - 需要帮助解决 hackerrank 挑战

c++ - 交换指针: equivalent of `std::unique_ptr::swap`

c++ - 最佳实践 : How to get a unique identifier for the object

c++ - 如何调用 char 构造函数而不是 char[] 构造函数

c++ - 访问类的私有(private)成员

c++ - 编译失败 - 没有#include - boost

MATLAB:如何总结向量中的内容?