如何在 C++ 中迭代向量时擦除或更改元素?
How to erase or change element while iterating over vector in C++?
当我偶然发现一个障碍时,我正在创建一个简单的 Erathostenes 函数筛。为了在这个任务中实现最高效率,我只想使用一个向量。这是当前代码:
vector<int> sieveOfErathostenes(int N) {
vector <int> result(N, 1);
for(int i = 2; i < sqrt(N); i++)
if(result[i] == 1)
for(int j = 2*i; j < N; j += i)
result.at(j) = 0;
// :c
return result;
}
此向量 returns 1 和 0 位于正确的位置,但我无法弄清楚如何在单个循环中同时实现擦除或更改元素的值。当我像 那样使用迭代器擦除元素时,我无法访问向量以更改其值,而当我使用标准 for 循环访问元素时,我无法删除它。我试过从向量的末尾开始计算非零元素并在擦除时给出一些偏移但没有成功。
TL DR:我想不通的是:
for(int i = 0; i < N; i++)
{
if(result[i] == 0) {
//remove at position i
} else {
result.at(i) = i;
}
}
提前感谢您的宝贵时间:)
不是擦除vector中间的元素,而是应该从vector的开头写入结果,并消除vector末尾未使用的元素。
int finalSize = 0;
for(int i = 0; i < N; i++)
{
if(result[i] != 0) {
result[finalSize++] = i;
}
}
result.resize(finalSize);
如果在遍历过程中您仍然需要从 std::vector
中删除一个元素,请记住 erase
returns 最后一个删除元素之后的迭代器:
std::vector<int> result = {1,1,1,0,1,1,1};
for(auto it = result.begin(); it != result.end(); )
{
if(*it==0)
it = result.erase(it);
else
it++;
}
当我偶然发现一个障碍时,我正在创建一个简单的 Erathostenes 函数筛。为了在这个任务中实现最高效率,我只想使用一个向量。这是当前代码:
vector<int> sieveOfErathostenes(int N) {
vector <int> result(N, 1);
for(int i = 2; i < sqrt(N); i++)
if(result[i] == 1)
for(int j = 2*i; j < N; j += i)
result.at(j) = 0;
// :c
return result;
}
此向量 returns 1 和 0 位于正确的位置,但我无法弄清楚如何在单个循环中同时实现擦除或更改元素的值。当我像
for(int i = 0; i < N; i++)
{
if(result[i] == 0) {
//remove at position i
} else {
result.at(i) = i;
}
}
提前感谢您的宝贵时间:)
不是擦除vector中间的元素,而是应该从vector的开头写入结果,并消除vector末尾未使用的元素。
int finalSize = 0;
for(int i = 0; i < N; i++)
{
if(result[i] != 0) {
result[finalSize++] = i;
}
}
result.resize(finalSize);
如果在遍历过程中您仍然需要从 std::vector
中删除一个元素,请记住 erase
returns 最后一个删除元素之后的迭代器:
std::vector<int> result = {1,1,1,0,1,1,1};
for(auto it = result.begin(); it != result.end(); )
{
if(*it==0)
it = result.erase(it);
else
it++;
}