调整cpp中的矢量大小

时间:2014-12-22 02:22:30

标签: c++ vector resize

是否有一种廉价的方法可以从开始而不是结束调整矢量V的大小。这样得到的矢量W看起来像这样:

V = 1,2,3,4

W = 2,3,4

当向量中存储的数据很长时,复制是一个糟糕的解决方案。我想知道是否存在更好的解决方案?

4 个答案:

答案 0 :(得分:1)

不,没有简单的方法可以做到这一点:向量只在后端增长和缩小。但是,如果您包装矢量并且您希望仅在计算中使用其部分,则可以将偏移存储到矢量中,并传递std::next(v.begin(), offset)代替普通begin()

vector<int> v {1,2,3,4};
size_t offset = 1;
ostream_iterator<int> out_it(std::cout,", ");
copy(next(v.begin(), offset), v.end(), out_it);

Demo.

这种方法的问题是元素0..offset-1的内存不会释放回执行环境。

答案 1 :(得分:1)

解决方案是使用deque代替vector,因为它旨在有效地从两端添加和删除。

如果由于某种原因你被卡住了,那么你也会陷入低效率的境地。没办法。

答案 2 :(得分:0)

如果你有一个支持移动语义的向量,可以使用move_iterator在旧std::move_iterator的帮助下创建一个新的向量:

vector<Foo> moved_vector(std::make_move_iterator(v.begin()+1),
                         std::make_move_iterator(v.end()));

这里我们假设Foo是一个可移动的类型。

请注意,对于POD,移动与复制相同,因此您不能保存任何内容。但对于例如std::string,上述情况有所不同。

答案 3 :(得分:0)

你拥有的最好的是std::vector::erase,它会对其余元素进行复制(移动,如果适用):

V.erase(V.begin());