使用 std::vector 迭代器在开始附近循环
Looping back near the beggining using std::vector iterators
我有一个迭代器,每当它到达终点时,它需要在向量的开头附近循环,因为它超过了终点,就像这样:
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
,从某种意义上说,它循环了但是当它到达末尾时被留下.我尝试了一堆不同的语法,但总是出现类型不匹配错误。有没有一种优雅的方式来做到这一点?
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);
}
So perhaps I increment vec{1,2,3,4,5} by 3, it should first remove 3
这与您尝试的代码不符。如果将第一个元素的迭代器递增 3 并将其擦除,那么您将擦除值为 4 的元素。
我有一个迭代器,每当它到达终点时,它需要在向量的开头附近循环,因为它超过了终点,就像这样:
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
,从某种意义上说,它循环了但是当它到达末尾时被留下.我尝试了一堆不同的语法,但总是出现类型不匹配错误。有没有一种优雅的方式来做到这一点?
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);
}
So perhaps I increment vec{1,2,3,4,5} by 3, it should first remove 3
这与您尝试的代码不符。如果将第一个元素的迭代器递增 3 并将其擦除,那么您将擦除值为 4 的元素。