c++ - 如何将不同的对添加到集合中?

标签 c++ algorithm c++11 compare stdset

我正在尝试将几对int 插入集合,这些对没有任何顺序;即,(1,2) = (2,1)。所以我简单地做如下,

typedef pair<int, int> pairs; 

set<pairs> Set;
pair <int,int> myPair;

// adding pairs:
myPair=pair<int,int>(0,1);
pathSet.insert(myPair);
myPair=pair<int,int>(0,2);
pathSet.insert(myPair);
myPair=pair<int,int>(1,0);
pathSet.insert(myPair);

所以我最终得到了一组

(0,1), (0,2) , (1,0)

我想拥有

(0,1), (0,2)

如何避免重复?有什么办法吗?与 'set' 相比,在效率方面是否有更好的 ADT,例如 std::unordered_set

最佳答案

您需要自定义比较函数。在那里,确保一对元素的顺序在比较时无关紧要。一个简单的方法是让对中的第一个元素始终是较小的元素(否则交换第一个和第二个)。

代码可能如下所示:

int main() {

    typedef pair<int, int> pairs;

    auto cmp = [](pairs a, pairs b) {
        if (a.first > a.second) {
            swap(a.first, a.second);
        }
        if (b.first > b.second) {
            swap(b.first, b.second);
        }
        return a < b;
    };
    set<pairs, decltype(cmp)> pathSet(cmp);

    pairs myPair=pair<int,int>(0,1);
    pathSet.insert(myPair);
    myPair=pair<int,int>(0,2);
    pathSet.insert(myPair);
    myPair=pair<int,int>(1,0);
    pathSet.insert(myPair);

    cout << pathSet.size();
}

输出:

2

关于c++ - 如何将不同的对添加到集合中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51013008/

相关文章:

python - 预测选择/有界兰特

c++ - 确定 "generic function"的返回类型

c++ - 在 C++ 中正确使用 exit()?

c++ - 有不合逻辑错误的数字猜谜游戏

c++ - 尝试使用 extern "C"在 C 中调用 C++ 方法,得到 "undefined reference to"对象的链接器错误

arrays - 找到具有给定约束的最大总和的对

c++ - 识别进程正在某些端口 C/C++ Windows 中运行

python - 我想用排列计算 "distance_table = []"中两个值之间的差值,在这种情况下如何正确使用排列?

c++ - 从 C++11 之前的代码调用 C++11 库时 move 语义

c++ - 将 freeglut 回调包装在一个类中的最优雅的方式