我已经制作了一个应该构建一组集合的代码。但是,当我使用迭代器尝试打印出所获得的集合时,我遇到了错误。 这是我的代码
#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;?或者是什么? 我该怎么做才能修复代码并打印出来? 谢谢你的帮助。
答案 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 << " ";
}