STL vector reserve() and copy()

有些话、适合烂在心里 提交于 2019-11-28 19:31:39

As noted in other answers and comments, you should just use vector's built-in functionality for this. But:

When you reserve() elements, the vector will allocate enough space for (at least?) that many elements. The elements do not exist in the vector, but the memory is ready to be used. This will then possibly speed up push_back() because the memory is already allocated.

When you resize() the vector, it will allocate enough space for those elements, but also add them to the vector.

So if you resize a vector to 100, you can access elements 0 - 99, but if you reserve 100 elements, they are not inserted yet, just ready to be used.

What you want is something like this:

vec2.reserve( vec1.size() );
copy(vec1.begin(), vec1.end(), std::back_inserter(vec2));

std::back_inserter is defined in <iterator>

rlbond

If the vectors are of the same type, use copy construction or copy assignment:

vec2(vec1);
vec2 = vec1;

If the vectors aren't the exact same (maybe a different allocator or something, or vec1 is a deque), what you really want is the range-based constructor or range-based assign:

vec2(vec1.begin(), vec1.end()); // range-based constructor

vec2.assign(vec1.begin(), vec1.end()); // range-based assignment

If you insist on doing it with std::copy, the proper method is:

copy(vec1.begin(), vec1.end(), back_inserter(vec2));

Since reserving the space does not make it assignable. copy works by assigning each element to its new value. So vec2.size() needs to be at least as large as vec1.size() in your case. Calling reserve doesn't actually change a vector's size, just its capacity.

In the book Effective STL, Scott Meyers argues that nearly all uses of std::copy for insertion should be replaced with range-based member functions. I suggest you pick up a copy, it's a great reference!

Why not: vec2 = vec1; ?

Change reserve to resize():

vec2.resize(vec1.size(), '\0');
copy(vec1.begin(), vec1.end(), vec2.begin());

I believe that is the fix you need.

I can't give you a very good description on the difference, but basically reserve() makes sure you have enough space, and resize() actually inserts something in there.

etham

In my opinion, the simplest way is to use the std::vector::insert method:

v2.insert(v2.end(), v1.begin(), v1.end());

(see http://www.sgi.com/tech/stl/Vector.html)

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!