【问题标题】:Resize vector given an iterator in C++ [duplicate]在C ++中给定迭代器调整向量的大小[重复]
【发布时间】:2016-10-14 04:59:32
【问题描述】:

假设我们得到std::vector<T> V 和一个迭代器p 指向向量内的某个位置。

Q1:返回一个新向量w的好方法是什么,给定的迭代器p是std::end(w)?

我可以创建一个新向量 w,将元素从 std::begin(v) 移动到 p 并分配 p = std::end(w)

Q2:有没有办法做我想做的,但保持pconst

我的问题的起源如下:我有一个向量,我为其应用了std::remove(std::begin(v),std::end(v), elem)。这应该将所有不等于elem 的元素放入该范围的末尾并返回一个迭代器。我想在那里剪辑矢量。

【问题讨论】:

  • 你不能返回一个 new 向量,因为迭代器只对给定的向量有效。不过,如果您愿意修改现有向量,只需致电 V.erase(p, V.end())
  • 你认为你为什么要这样做?
  • @LightnessRacesinOrbit 会用原因展开问题
  • 擦除/删除习语有什么问题?此外,remove 不会将元素移动到末尾。结束元素具有未指定的值。

标签: c++ c++11


【解决方案1】:

你可以这样做:

std::vector<T> w = v;
v.erase(p, v.end());
w.swap(v);

现在pwp == w.end() 的迭代器,v 是原始向量。请注意,交换两个动态容器(使用适当的分配器)会使一个容器的迭代器成为另一个容器的迭代器。

这对于从函数返回值不太适用,因为移动构造没有类似的保证,复制省略也不是强制性的。


但是,鉴于您说 premove 的结果,也许更简单的解决方案是典型的 remove-erase 习惯用法:

v.erase(std::remove(std::begin(v),std::end(v), elem), std::end(v));

【讨论】:

  • 就地执行此操作:v.resize(std::distance(v.begin(), p));
猜你喜欢
  • 2011-01-08
  • 1970-01-01
  • 2010-12-10
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多