在重载输出运算符时,我的盲人或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::set
替换为std::vector
,并在包含中替换<set>
<vector>
,则代码将按预期工作。区别在哪里?我的编译器(g ++)给出了奇怪的错误消息,如下所示。
/ usr / include / c ++ / 4.8 / bits / stl_iterator.h:297:5:注意:模板参数扣除/替换失败:
所以即使我明确告诉我使用std::set<int>
它会以某种方式失败,这种行为只会发生在std::set
上。
答案 0 :(得分:3)
要在两种情况下工作,你应该是:
for (std::set<int>::const_iterator it = myset.begin(); it != myset.end(); ++it)
it < myset.end()
仅适用于std::set::iterator
为双向的随机访问迭代器。
Here您可以阅读双向迭代器提供的对random access one
的内容答案 1 :(得分:1)
您的循环条件错误it < myset.end();
。 std::set::iterator
无法与<
运算符进行比较,因为它不是随机访问迭代器。 this sample中的错误消息更清楚。
要修复,请使用!=
运算符进行比较:
#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循环体缺少}
。
答案 2 :(得分:1)
将循环更改为
后,您的代码构建正常for (std::set<int>::const_iterator it = myset.begin(); it != myset.end(); ++it)
请注意,通常,您不能假设您可以小于比较迭代器。
一些容器&#39;迭代器可能支持这个(这可能也取决于实现),但你真的不应该依赖它。