首页 > 解决方案 > 如何将结构插入集合并打印集合的成员?

问题描述

我必须使用 struct mov

struct mov {
   string src;
   string dst;
};

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

标签: c++structinsertset

解决方案


<<并且<永远不会感到困惑。包装成员并使用按字典顺序实现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按如下方式工作。演示在这里。

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

推荐阅读