如何将结构插入集合并打印集合的成员?

时间:2018-11-02 22:08:20

标签: c++ struct insert set

我必须使用struct mov

struct mov {
   string src;
   string dst;
};

其中src是源,而dst是目标。该程序的目的是分析棋盘上的棋子并生成所有可能的动作。可能的移动必须在一组中表示,但必须是一组移动,因此已设置。我发现一些方法可以实现比较器,但是我不知道它是否有效,因为在打印集(使用迭代器)时,由于打印时出现“ <<”,我会出错,我猜它与比较器冲突,因为它使用“ <” ???

1 个答案:

答案 0 :(得分:1)

<<<永远不会混淆。打包mov成员并利用std::tupleoperator<实现为字典顺序的事实,您可以轻松编写mov的比较器,如下所示:

struct mov 
{  
    std::string src; 
    std::string dst;

    bool operator<(const mov& rhs) const {
        return std::tie(src, dst) < std::tie(rhs.src, rhs.dst);
    }
};

然后,此方法可与std::set配合使用,如下所示。 DEMO is here.

int main()
{
    std::set<mov> moves{ {"src1","dts1"}, {"src2","dts2"}, {"src3","dts3"} };

    // iterator
    std::cout << "Using iterator," << std::endl;
    for(auto it = moves.begin(); it != moves.cend(); ++it){
        std::cout << it->src << "," << it->dst << std::endl;
    }
    std::cout << std::endl;    

    // range-based-for
    std::cout << "Using range-based-for," << std::endl;
    for(const auto& mov_i : moves){
        std::cout << mov_i.src << "," << mov_i.dst << std::endl;
    }

    return 0;
}