在c ++中迭代集合

时间:2016-02-17 16:50:22

标签: c++ vector set

在重载输出运算符时,我的盲人或std::setstd::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上。

3 个答案:

答案 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 () {}

Working Demo

顺便说一句,你的样本中的for循环体缺少}

答案 2 :(得分:1)

将循环更改为

后,您的代码构建正常
for (std::set<int>::const_iterator it = myset.begin(); it != myset.end(); ++it)

请注意,通常,您不能假设您可以小于比较迭代器。

一些容器&#39;迭代器可能支持这个(这可能也取决于实现),但你真的不应该依赖它。