如何遍历一组集合 C++

how to iterate through a set of sets C++

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

非常感谢大家的帮助,谢谢!

三胞胎不是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;
    }
}

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

我会这样做:

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

您有一个错误,因为 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;
}

如果在迭代器上使用 increment/decrement 运算符 (++/--),最好使用前缀版本 (++it) 而不是后缀个(it++)。这是因为后缀 ones 在递增之前创建了迭代器的副本(然后返回该副本)但在这种情况下,您不需要它。

此外,如果您使用的是 C++11,则可以使用基于范围的 for 循环和 auto 关键字,这会大大简化事情:

for(const auto &innerSet : Triplets)
{
    for(const auto &innerSetElement : innerSet)
    {
        cout << innerSetElement;
    }

    cout << endl;
}

首先:如果他们是三胞胎,你确定std::set是你喜欢的类型吗 想要内在价值。也许 class 会更 合适的,在这种情况下,您为 `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。)