考虑以下情况:
std::vector<int> A;
std::vector<int> B;
std::vector<int> AB;
我希望AB
的内容为A
,然后B
的内容按相同的顺序排列。
方法1:
AB.reserve( A.size() + B.size() ); // preallocate memory
AB.insert( AB.end(), A.begin(), A.end() );
AB.insert( AB.end(), B.begin(), B.end() );
方法2:
std::vector<int> AB ( A.begin(), A.end() ); // calling constructor
AB.insert ( AB.end(), B.begin(), B.end() );
上述哪种方法效率更高?为什么? 是否有更高效的不同方法?
答案 0 :(得分:8)
第一个可能更高效,因为您可以保证只执行一次内存分配。在第二个中,很可能(大多数实现都会)在向量构造期间完成A.size()
的分配,然后insert
将触发第二次分配,因为它需要增长{{1元素。
答案 1 :(得分:3)
方法1执行 no 重新分配,而方法2可能会多次重新分配,并且实际上很可能会重新分配一次。所以方法1更好。
答案 2 :(得分:1)
我认为第一个将永远比第二个快,因为它只执行一次内存分配,第二次可能必须重新分配至少一次。但是my measurements似乎表明,对于大小小于100,000的大小,这甚至更快:
std::vector<int> AB(A.size() + B.size());
std::copy(A.begin(), A.end(), AB.begin());
std::copy(B.begin(), B.end(), AB.begin() + B.size());
我猜这是因为,这不仅仅执行一次分配而且没有重新分配,甚至不需要检查它是否应该进行任何重新分配。缺点是可能最初必须将所有内存归零,但我认为CPU很擅长。