是否有一种廉价的方法可以从开始而不是结束调整矢量V的大小。这样得到的矢量W看起来像这样:
V = 1,2,3,4
W = 2,3,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);
这种方法的问题是元素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());