对C ++来说很新,只有一周左右,我想迭代一组嵌套集,并将内部集中的每个元素写入文件中的一行。 每个内部集合有3个元素,我希望所有三个元素在同一条线上。 我的设置如下:
// Define "bigSet" and initiate as empty set "Triplets"
typedef set < set<string> > bigSet;
bigSet Triplets;
我尝试过这种方法来完成它,但它给了我一个错误......
// Iterate through and print output
set <string>::iterator it;
for(it = Triplets.begin(); it != Triplets.end(); it++){
cout << *it << endl;
}
非常感谢任何帮助,谢谢你们!
答案 0 :(得分:2)
三胞胎不是set<string>
;它是set<set<string>>
; Triplets中的每个项目本身都是set
,可以包含多个字符串。
迭代器必须与容器的类型匹配;对于两级嵌套容器,您应该迭代两次:
set<set<string>>::iterator it;
set<string>::iterator it2;
for(it = Triplets.begin(); it != Triplets.end(); it++) {
for (it2 = it->begin(); it2 != it->end(); ++it2) {
cout << *it2 << endl;
}
}
答案 1 :(得分:2)
我会这样做:
// Iterate through and print output
set < set <string> >::iterator it_ex; // iterator for the "outer" structure
set <string>::iterator it_in; // iterator for the "inner" structure
for(it_ex = Triplets.begin(); it_ex != Triplets.end(); it_ex++)
{
for(it_in = it_ex->begin(); it_in != it_ex->end(); it_in++)
cout << *it_in << ", ";
cout << endl;
}
答案 2 :(得分:1)
Triplets
类型为set < set<string> >
,因此需要类型为set < set<string> >::iterator
或bigSet::iterator
的迭代器。它不是set <string>
类型。您也可以使用const_iterator
。
请注意,迭代Triplets
会为您提供另一个集合的迭代器,而不是字符串。
还要考虑
for (const auto& i : Triplets)
{
for (const auto& j : i)
{
cout << j << endl;
}
}
答案 3 :(得分:1)
您有错误,因为Triplets.begin()
不是set<string>::iterator
类型,而是set<set<string>>::iterator
。
你需要做的是有两个循环:一个用于迭代外层,一个用于内层。
set<set<string>>::iterator it;
for(it = Triplets.begin(); it != Triplets.end(); ++it)
{
set<string>::iterator it2;
for(it2 = it->begin(); it2 != it->end(); ++it2)
{
cout << *it2;
}
cout << endl;
}
如果在迭代器上使用递增/递减运算符(++
/ --
),最好使用前缀版本(++it
)而不是后缀版本({{ 1}})。这是因为后缀是在迭代器增加之前创建它的副本(然后返回该副本),但在这种情况下,你不需要它。
此外,如果你使用的是C ++ 11,你可以使用基于范围的for循环和it++
关键字,这可以简化很多事情:
auto
答案 4 :(得分:0)
首先:如果他们是三胞胎,你确定std::set
是你的类型吗?
想要内在的价值观。也许class
会更多
适当的,在这种情况下,你为`类定义operator<<
,
而你的简单循环完美无缺。类似的东西:
class Triplet
{
std::string x;
std::string y;
std::string z;
public:
// Constructors to enforce that none of the entries are identical...
// Accessors, etc.
friend std::ostream& operator<<( std::ostream& dest, Triplet )
{
dest << x << ", " << y << ", " << z;
return dest;
}
};
然后输出:
for ( Triplet const& elem : Triplets ) {
std::cout << elem << std::endl;
}
否则:您需要为输出定义所需的格式。在
特别是,您可能希望在字符串之间使用分隔符
例如,行。这意味着你可能无法使用基于范围的
for
,至少不适用于内循环。你需要这样的东西:
for ( std::set<std::string> const& triplet : Triplets ) {
for ( auto it = triplet.cbegin(); it != triplet.cend(); ++it ) {
if ( it != triplet.cebegin() ) {
std::cout << ", ";
}
std::cout << *it;
}
std::cout << std::endl;
}
(如果这套三胞胎很大,你肯定会考虑
将std::endl
替换为'\n'
。但当然,如果确实如此
很大,你可能不会输出到std::cout
。)