e*******s 发帖数: 1979 | 1 以下这段代码 把set的iterator直接传递到parameter为reference的函数里
报错
test.cpp: In function 'int main()':
test.cpp:110: error: invalid initialization of reference of type 'std::
string&' from expression of type 'const std::basic_string
traits, std::allocator >'
test.cpp:67: error: in passing argument 1 of 'void foo(std::string&)'
make: *** [a] Error 1
如果修改代码
1. void foo(string &s) --> void foo(string s)
2. string s = *it; foo(s);
3. void foo(string &s) --> void foo(const string &s)
4. unordered_set vs --> vector vs;
都不会报错.
原因是什么呢, 1. 2.可以理解为dereference不能传入reference parameter中去,因
为可能会引用局部变量
3. 可以理解为不能修改set::iterator指向都局部变量
4. 就很奇葩了, vector::iterator 和 set::iterator的区别不应该在dereference上把
在标准上好像就是random access iterator 和 bidirectional iterator的区别
编译器是 gcc 4.4.2
void foo(string &s)
{
return;
}
unordered_set vs;
for(auto it = vs.begin(); it != vs.end(); ++it){
foo(*it);
} | l*********8 发帖数: 4642 | 2 unordered_set 或者set的iterator指向的内容是const的。
否则, 如果你可以修改*it, 那么*it在hash map or bst里面的位置就要改变了,那么
这个iterator就要变成invalid了。 乱套了。
【在 e*******s 的大作中提到】 : 以下这段代码 把set的iterator直接传递到parameter为reference的函数里 : 报错 : test.cpp: In function 'int main()': : test.cpp:110: error: invalid initialization of reference of type 'std:: : string&' from expression of type 'const std::basic_string: traits, std::allocator >' : test.cpp:67: error: in passing argument 1 of 'void foo(std::string&)' : make: *** [a] Error 1 : 如果修改代码 : 1. void foo(string &s) --> void foo(string s)
| m*******g 发帖数: 410 | |
|