如何为一组集打印出迭代器

时间:2015-11-16 11:45:27

标签: c++ iterator set

我已经制作了一个应该构建一组集合的代码。但是,当我使用迭代器尝试打印出所获得的集合时,我遇到了错误。 这是我的代码

#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开头的行进行注释,则程序会无错误地构建。但是,此行有一个错误,因为如果我尝试构建计算机拒绝它,我会收到以下错误消息:错误:不匹配&#39;运算符&lt;&lt;&lt;&#39; in&#39; std :: cout&lt;&lt; si.std :: _ Rb_tree_const_iterator&lt; _Tp&gt; :: operator *&gt;()&#39; |

现在我对此很陌生,但我怀疑这个错误是否与我应该重新定义运营商&#34;&lt;&lt;&#34;?或者是什么? 我该怎么做才能修复代码并打印出来? 谢谢你的帮助。

3 个答案:

答案 0 :(得分:0)

我相信你应该创建另一个迭代器来迭代内部集合:

set<long>::iterator in;

并使用这样的迭代器:

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

因为si中的每个项目都是另一个集合,所以它可以包含几个长变量。

答案 1 :(得分:0)

你需要遍历内部集合:

#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;
}

答案 2 :(得分: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 << " ";  
}