【发布时间】: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