如何迭代一组C ++集

时间:2015-01-26 14:51:13

标签: c++ iterator set nested-sets

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

非常感谢任何帮助,谢谢你们!

5 个答案:

答案 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> >::iteratorbigSet::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。)