我有一个迭代遍历向量并擦除每三个数字的赋值。如果它到达向量的末尾,它应该从第一个条目再次继续计数,直到只剩下一个数字。用户输入向量中应包含的数量。
我很难适应矢量和数组之间的区别 - 就在上周我们遇到了一个问题,包括绕过一个数组,这是用mod解决的,但我很快发现这对矢量不起作用
到目前为止,这是我的想法:迭代并删除每个第三个条目,直到向量的大小为1.
while (vector.size > 1) {
for(std::vector<int>::iterator i = suitors.begin(); i <= suitors.end(); i++) {
// here, add a case for if it hits the end, start over
if (i = suitors.end()) {
i = suitors.begin();
}
suitors.erase(suitors.at(i) + 2);
}
我遇到的问题是弄清楚如何让它重新开始,因为当我尝试以这种方式使用i时会发出错误。
任何建议或提示让我走上正确的道路?我开始看到多功能的矢量是多少,但它们还没有点击。我也不确定是否有更好的方法可以阻止它在while循环之外进行迭代。
答案 0 :(得分:1)
每当每次递增的索引变量达到3时,我都会使用remove_if
将向量中的项目移动到最后。
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v{1,2,3,4,5,6};
unsigned index = 0; // this is the index variable used to remove elements
auto end = v.end(); // point to the current end of the vector
// keep looping until there is only 1 element in the vector
while(std::distance(v.begin(), end) > 1) {
// remove_if will call the predicate for each element
// the predicate simply increments the index each time, and when it reaches
// 3 indicates that element should be removed
// remove_if will move items to the end of the vector and return an
// iterator to the end of the new range, so we'll update the end variable
// with the result
end = std::remove_if(v.begin(), end, [&index](int) {
if(++index == 3) {
// reset the index and indicate this element should be removed
return (index = 0), true;
}
return false;
});
for(auto iter = v.begin(); iter != end; ++iter) {
std::cout << *iter << ' ';
}
std::cout << '\n';
}
// erase all the elements we've removed so far
v.erase(end, v.end());
}
输出:
1 2 4 5
1 2 5
1 5
1
答案 1 :(得分:0)
外部while循环我假设只要向量有多个元素就行,但这应该包含在for中,而不是另一个循环
语法问题在if:
中if (i = suitors.end())
// ^ should be ==
否则你只是为你的迭代器分配结尾
for(std::vector<int>::iterator i = suitors.begin(); suitors.size() > 1; ++i) {
// ^ loop condition changed
if (i == suitors.end()) {
i = suitors.begin();
}
suitors.erase(suitors.at(i) + 2);
}
在迭代它时修改容器是危险的..