如何打印出一组集合的迭代器

How to print out an iterator for a set of sets

我做了一个代码,应该构造一组集合。但是,当我使用迭代器尝试打印出获得的集合时,我 运行 陷入了错误。 这是我的代码

#include <iostream>
#include <set>
using namespace std;


int main()
{
    set<long> A, B, C;

    for (long k=1; k<4; k++) A.insert(k);   // A={1, 2, 3}
    for (long k=4; k<6; k++) B.insert(k);   // B={4, 5}
    C.insert(6);                            // C={6}

    set< set<long> > S;       // Now implement S as a set of  finite sets
    S.insert(A);
    S.insert(B);
    S.insert(C);

    /** Finally, print out S using an iterator si: **/

    set< set<long> >::const_iterator si;

    for (si=S.begin(); si !=S.end(); si)
    {
        cout << *si << " ";
    }
    cout << endl;

    return 0;
}

如果我注释以 cout 开头的行,则程序构建没有错误。但是,此行有一个错误,因为如果我尝试构建计算机会拒绝它,并且会收到以下错误消息:错误:'std::cout << si.std::_Rb_tree_const_iterator<_Tp>::operator* >()'|

中的 'operator<<' 不匹配

现在我对此很陌生,但我怀疑错误是否与我应该重新定义运算符“<<”有关?或者是什么? 我应该怎么做才能修复代码并打印出集合? 感谢您的帮助。

我认为您应该创建另一个迭代器来遍历内部集:

set<long>::iterator in;

并像这样使用两个迭代器:

for(si = S.begin(); si != S.end(); ++si)
  for(in = si->begin(); in != si->end(); ++in)
    std::cout << *in << " ";

因为si里面的每一项都是另外一个集合,可以包含多个long变量。

您需要遍历内部集合:

#include <set>
#include <iostream>
using namespace std;

int main()
{
set<long> A, B, C;

for (long k = 1; k<4; k++) A.insert(k);   // A={1, 2, 3}
for (long k = 4; k<6; k++) B.insert(k);   // B={4, 5}
C.insert(6);                            // C={6}

set< set<long> > S;       // Now implement S as a set of  finite sets
S.insert(A); S.insert(B); S.insert(C);

/** Finally, print out S using an iterator si: **/

set< set<long> >::const_iterator si;
set<long>::const_iterator si2;

for (si = S.begin(); si != S.end(); ++si)
{
    for (si2 = si->begin(); si2 != si->end(); ++si2)
    {
        cout << *si2 << " ";
    }
    cout << endl;
}
cout << endl;

return 0;
}

C++ 11 11答案更优雅:

#include <set>
#include <iostream>
using namespace std;

int main()
{
set<long> A, B, C;

for (long k = 1; k<4; k++) A.insert(k);   // A={1, 2, 3}
for (long k = 4; k<6; k++) B.insert(k);   // B={4, 5}
C.insert(6);                            // C={6}

set< set<long> > S;       // Now implement S as a set of  finite sets
S.insert(A); S.insert(B); S.insert(C);

/** Finally, print out S using an iterator si: **/

for (auto si : S)
{
    for (auto si2 : si)
    {
        cout << si2 << " ";
    }
    cout << endl;
}
cout << endl;

return 0;
}

这是一种可能的解决方案,不是解决方案:

class LongSet: public set<long> {

    // Here can choose custom way to print out your set.
    friend std::ostream& operator<< (std::ostream& stream, const LongSet& matrix) {
        set<long>::iterator i = this.begin();
        for (; i != this.end(); ++i) {
           stream << *i << " ";
        } 
        return stream
    }

}

这样,您的代码将是:

set< LongSet >::const_iterator si;

for (si=S.begin(); si !=S.end(); si){
   cout << *si << " ";  
}