我可以在迭代它时修改C++容器的值吗?

bod*_*ydo 2 c++ containers

让我们说我有一个vector<int> vals.我正在迭代它并将值更改为绝对值:

for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) {
    if (*it < 0) *it = -*it;
}
Run Code Online (Sandbox Code Playgroud)

这是允许的吗?我没有改变它的大小vector<int>所以我不认为它会失效.我觉得我很安全.我想证实这一点.

小智 8

是的,这很安全.您没有更改底层存储.请记住,如果您像const在以下函数中那样传递容器,它将无法工作:

void doSomething(const vector<int>& vals)
Run Code Online (Sandbox Code Playgroud)

这个网站很好地讨论了这个问题:http://www.cplusplus.com/reference/vector/vector/begin/


Jer*_*fin 6

它是安全的并且允许用于序列容器(例如arrayvectordeque)。

对于 a setor multiset,不允许修改(尽管编译器可能不会拒绝尝试这样做的代码)。

对于mapor multimap,您必须将键视为常量,但您可以修改与该键关联的值(这同样适用于unordered_变体)。

顺便说一句,您可能需要考虑一种算法而不是上面使用的循环:

std::transform(vals.begin(), vals.end(), vals.begin(), ::std::abs);
Run Code Online (Sandbox Code Playgroud)