【问题标题】:Unable to use pair<int, int> as key in set in C++ STL无法在 C++ STL 中使用 pair<int, int> 作为 set 中的键
【发布时间】:2017-09-05 05:14:19
【问题描述】:

Set 是一个排序关联容器,用于存储 Key 类型的对象。 Set 是一个简单的关联容器,意味着它的值类型,如 以及它的密钥类型,是Key。它也是一个独特的联想 容器,意味着没有两个元素是相同的。

我试图构建一个set&lt;pair&lt;int, int&gt;&gt;,其编号和它在字符串中出现的位置为key

当尝试插入 pair&lt;int, int&gt; 作为 set 的键时,尽管 pair 是唯一的,但当该对的第一个元素再次出现时,插入未成功。

#include <iostream>
#include <set>
#include <iterator>

using namespace std;
struct compare
{
    bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs)
    {
        return lhs.first > rhs.first;
    }
};
void print(set<pair<int, int>, compare> myset)
{
    for(auto iter=myset.begin(); iter!=myset.end();++iter){
        cout << iter->first << ' ' << iter->second << endl;
    }
}

void BuildSet(int num)
{
    set<pair<int, int>, compare> values;
    string number = to_string(num);
    for(int i=0; i<number.size(); ++i)
    {
        int quot = number[i]-'0';
        values.insert(make_pair(quot, i));
    }
    cout << endl;
    print(values);
    cout << endl;
}
int main() {
    BuildSet(98738);
}

输出是:

9 0
8 1
7 2
3 3

由于第一个元素被复制而缺少条目8 4

【问题讨论】:

    标签: c++ stl set std-pair


    【解决方案1】:

    原因很简单。

    compare 方法确实知道如何处理第一个元素已经存在于“set”中的情况。将其修改为此解决了此问题。

    struct compare
    {
        bool operator()(const pair<int, int> &lhs, const pair<int, int> &rhs)
        {
             if(lhs.first != rhs.first)
             {
                 return lhs.first > rhs.first;
             }
            else
            {
                return lhs.second > rhs.second;
            }
        }
    };
    

    在这里,首先比较pair 的第一个元素,如果相等,则检查第二个元素,而不是仅比较第一个元素时的前一个元素。

    【讨论】:

    • 是的,你可以这样做。或者只使用std::greater&lt;std::pair&lt;int, int&gt;&gt;
    • @StoryTeller 是的,这将是一种干净的方式。我添加了这个以防任何人忙于编写自己的 compare 方法。
    • 或者只是lhs &gt; rhs;
    【解决方案2】:

    你可以使用仿函数:

    greater&lt;pair&lt;int, int&gt;&gt;()

    less&lt;pair&lt;int,int&gt;&gt;()

    作为 cmp 函数。 还有#include&lt;functional&gt;

    【讨论】:

    • less&lt;T&gt; 已经是std::set&lt;T&gt; 的默认值,即使T==std::pair&lt;int,int&gt; 也是如此。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2011-06-19
    • 2021-11-18
    • 1970-01-01
    • 2020-10-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多