std :: vector在增长时会调用swap函数吗?总是或仅适用于某些类型?

Mic*_*bon 10 c++ swap vector

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

什么时候std::vector完全利用交换功能?我在C++标准中找不到任何关于它的东西.是否在缓冲区重新分配期间发生?

我做了一些测试才发现它,但我失败了.根本不调用我的自定义数据类型的交换函数.

编辑:这是我的测试程序.

sbk*_*sbk 8

我没有链接支持这些声明,但据我所知,与Microsoft C++一起分发的STL实现使用一些内部非标准魔术注释来标记vector(和其他STL集合)为具有性能交换,因此vector<vector<>>不会复制内部向量但交换它们.直到VC9,在VC10中,它们将切换到rvalue-references.我认为你不应该像没有交叉编译器的方式那样标记你自己的类,你的代码只能在特定的编译器版本上工作.

编辑:我快速浏览了<vector>VC9 中的标题,发现了这个:

    // vector implements a performant swap
template <class _Ty, class _Ax>
    class _Move_operation_category<vector<_Ty, _Ax> >
    {
    public:
        typedef _Swap_move_tag _Move_cat;
    };
Run Code Online (Sandbox Code Playgroud)

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