据我所知,我可以使用 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/