[英]Iterating over sets in c++
在重载输出运算符时,我是瞎子还是std::set
行为与std::vector
有很大不同。 考虑下面的代码。
#include <set>
#include <iostream>
std::ostream& operator<<(std::ostream& os, const std::set<int>& myset) {
for (std::set<int>::const_iterator it = myset.begin(); it < myset.end(); ++it) {
os << *it;
return os;
}
}
int main () {}
如果在两个位置用std::vector
替换了std::set
,在includes中用<vector>
替换了<set>
,则代码按预期工作。 区别在哪里? 我的编译器(g ++)给出了如下奇怪的错误消息。
/usr/include/c++/4.8/bits/stl_iterator.h:297:5:注意:模板参数推导/替换失败:
因此,即使我明确地告诉我正在使用std::set<int>
它还是会以某种方式失败,并且此行为仅发生在std::set
。
您的循环条件是错误的it < myset.end();
。 std::set::iterator
不是与<
运算符进行比较,因为它不是随机访问迭代器。 此示例中的错误消息对此更加清晰。
要修复,请使用!=
运算符进行比较:
#include <set>
#include <iostream>
std::ostream& operator<<(std::ostream& os, const std::set<int>& myset) {
for (std::set<int>::const_iterator it = myset.begin(); it != myset.end(); ++it) {
// ^^
os << *it;
}
return os;
}
int main () {}
顺便说一句,您的示例中的for循环主体缺少}
。
将循环更改为后,您的代码构建良好
for (std::set<int>::const_iterator it = myset.begin(); it != myset.end(); ++it)
请注意,通常,您不能假设您可以小于比较迭代器。
某些容器的迭代器可能支持此功能(这也可能取决于实现),但您实际上不应该依赖于此。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.