如何打印出一组集合的迭代器
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 << " ";
}
我做了一个代码,应该构造一组集合。但是,当我使用迭代器尝试打印出获得的集合时,我 运行 陷入了错误。 这是我的代码
#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 << " ";
}