2012-12-17 51 views
2

假设我有vector<int> vals。我在迭代它并将值更改为绝对值:我可以在迭代时修改C++容器的值吗?

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

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

回答

8

是的,它很安全。您不会更改基础存储。

void doSomething(const vector<int>& vals) 

这个本网站的会谈非常好:请记住,如果你在这样的函数传递容器作为const它不会工作http://www.cplusplus.com/reference/vector/vector/begin/

+0

Thenks!我不知道const &&迭代器。从站点:“**如果vector对象是const限定的,函数('begin()')返回一个const_iterator,否则返回一个迭代器。**” – bodacydo

+0

是的。它允许你在'const'之后写入.begin和.end,并且仍然有效。然而,当你尝试使用'const_iterator'为一个元素赋值时,你的编译器会对你大吼。这延伸到容器中的类,其中类方法声明为“const”,或者如果使用'const_iterator'则无关紧要。 – dlp

2

它是安全的,并允许序列容器(例如,array,vectordeque)。

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

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

顺便说一句,你可能要代替循环的考虑算法您在上面使用:

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

我很担心修改像int这样的固定大小的类型的结构与像字符串这样的可变大小类型之间的区别。就像,如果我有一个矢量,甚至是一个由字符串组成的映射,并且我将一个值设置为一个更大的字符串,看起来它可能导致整个容器重新分配或转移,使指针/迭代器无效。你能指点我到一个官方的地方吗?它说迭代器必须保持有效,即使你改变了一个值的大小? –

相关问题