繁体   English   中英

在C ++中遍历集合

[英]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

要在两种情况下都可以工作,循环应为:

for (std::set<int>::const_iterator it = myset.begin(); it != myset.end(); ++it)

it < myset.end()仅适用于std::set::iterator是双向的随机访问迭代std::set::iterator

在这里,您可以了解双向迭代器提供的功能与随机访问提供的功能

您的循环条件是错误的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM