【问题标题】:Looping back near the beggining using std::vector iterators使用 std::vector 迭代器在开头附近循环
【发布时间】:2021-11-10 09:07:44
【问题描述】:

我有一个迭代器,当它到达终点时,它需要在向量的开头附近循环,对于它超过终点的量,如下所示:

std::vector<int> vec = {...}, vec1;
std::vector<int>::iterator it = vec.begin();

for(;vec.size() != 0;){

it += k; //k is a const integer
if(it >= vec.end()){
it -= items.end(); // something like that, but this syntax is obviously invalid
}

vec1.push_back(*it);
it = vec.erase(it);
}

所以也许我将vec{1,2,3,4,5} 增加 3,它应该首先删除 3,然后删除 1 并将它们放入 vec1,从某种意义上说,它会循环,但是当它到达末尾时会留下。我尝试了一堆不同的语法,但总是出现类型不匹配错误。有没有一种优雅的方式来做到这一点?

【问题讨论】:

  • it = items.begin(); ?但是您需要注意erase 使it 失效
  • 无论何时使用erase,您都应该始终使用what it returns
  • 等待...“它超过了最后的金额”?迭代器不能越过容器的末端。你应该解释你的代码的实际目的是什么,因为你目前的方法是有缺陷的
  • it += k; 代替:it = std::next(vec.begin(), (std::distance(vec.begin(), it) + k) % vec.size()); 可以解决问题。
  • @463035818_is_not_a_number 我的意思是让它从一开始就开始+在它“越过”结束之前还剩下多少。如果它增加 3 并且它在 n - 2 元素处,它应该转到第一个元素。如果它在 n - 1 元素处,它应该转到向量中的第二个元素(n 是向量的大小)。这更有意义吗?

标签: c++ vector iterator stdvector


【解决方案1】:

XY 解决方案:我建议保留索引而不是迭代器并使用余数运算符。

for(std::size_t i = 0; vec.size() != 0;){
    i = (i + k) % vec.size();
    vec1.push_back(vec[i]);
    vec.erase(vec.begin() + i);
}

所以也许我将 vec{1,2,3,4,5} 增加 3,它应该首先删除 3

这与您尝试的代码不匹配。如果将迭代器增加到第一个元素 3 并擦除它,那么您将擦除值为 4 的元素。

【讨论】:

  • 经过一些修改后效果很好,k 应该是 k - 1,否则如果 k = 3,它会跳过 3 个元素并取出第 4 个元素,而不是跳过 2 并取出第三个元素,但这几乎是吹毛求疵。非常感谢!
  • @yomag1234 是的,我不太确定哪个顺序对你来说是正确的。根据自己的喜好调整。
猜你喜欢
  • 1970-01-01
  • 2011-04-14
  • 2020-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 2014-11-08
相关资源
最近更新 更多