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

时间:2012-12-17 19:14:24

标签: c++ containers

假设我有vector<int> vals。我正在迭代它并将值更改为绝对值:

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

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

2 个答案:

答案 0 :(得分:8)

是的,这很安全。您没有更改底层存储。请记住,如果您将容器作为const传递到这样的函数中,它将无效:

void doSomething(const vector<int>& vals)

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

答案 1 :(得分:4)

安全且允许使用序列容器(例如arrayvectordeque)。

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

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

顺便说一句,你可能想要考虑一个算法,而不是你上面使用过的循环:

std::transform(vals.begin(), vals.end(), vals.begin(), ::std::abs);