假设我有一个vector<int> vals
. 我正在迭代它并将值更改为绝对值:
for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) {
if (*it < 0) *it = -*it;
}
这是允许的吗?我没有改变它的大小,vector<int>
所以我认为它不会失效。我想我很安全。我想确认这一点。
假设我有一个vector<int> vals
. 我正在迭代它并将值更改为绝对值:
for (vector<int>::iterator it = vals.begin(); it != vals.end(); ++it) {
if (*it < 0) *it = -*it;
}
这是允许的吗?我没有改变它的大小,vector<int>
所以我认为它不会失效。我想我很安全。我想确认这一点。
是的,它是安全的。您不会更改底层存储。const
请记住,如果您像这样在函数中传递容器,它将不起作用:
void doSomething(const vector<int>& vals)
该站点对此进行了很好的讨论:http ://www.cplusplus.com/reference/vector/vector/begin/
它是安全的并且允许用于序列容器(例如array
,vector
和deque
)。
对于set
or multiset
,不允许修改(尽管编译器可能不会拒绝尝试这样做的代码)。
对于map
or multimap
,您必须将键视为常量,但您可以修改与该键关联的值(这同样适用于unordered_
变体)。
顺便说一句,您可能需要考虑一种算法,而不是上面使用的循环:
std::transform(vals.begin(), vals.end(), vals.begin(), ::std::abs);