C++ 查找集合键和贴图键之间的集合_差异

C++ 查找集合键和贴图键之间的集合_差异,c++,map,set,set-difference,C++,Map,Set,Set Difference,我想问一下,是否可以提供一个示例,说明如何使用set_difference查找地图的集合和关键点之间的差异 我知道这是另一个问题,但它指向另一个没有明确例子的问题。我需要一个不使用boost库的解决方案 #include <algorithm> #include <set> #include <iterator> // ... std::set<int> s1, s2; // Fill in s1 and s2 with values std::s

我想问一下,是否可以提供一个示例,说明如何使用set_difference查找地图的集合和关键点之间的差异

我知道这是另一个问题,但它指向另一个没有明确例子的问题。我需要一个不使用boost库的解决方案

#include <algorithm>
#include <set>
#include <iterator>
// ...
std::set<int> s1, s2;
// Fill in s1 and s2 with values
std::set<int> result;
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
    std::inserter(result, result.end()));
#包括
#包括
#包括
// ...
std::集s1、s2;
//用数值填写s1和s2
std::设置结果;
设置差异(s1.begin(),s1.end(),s2.begin(),s2.end(),
std::inserter(result,result.end());

您可以使用自定义比较器执行此操作。标准算法使用严格的弱排序。为了测试两个元素的相等性,比较器需要应用两次。当
comp(第一,第二)
comp(第二,第一)
返回false(其中
comp
是比较器函数)时,两个元素相等。由于要比较的元素类型不同,一个比较器不行-需要两个重载:

struct cmp {
    bool operator()(int i, const std::pair<int, double>& p) const
    {
        return i < p.first;
    }

    bool operator()(const std::pair<int, double>& p, int i) const
    {
        return p.first < i;
    }

};

int main()
{

    std::set<int> s1 { 1, 2, 3, 4 };
    std::map<int, double> s2 { {1, 0}, {2,0}, {4,0} };

    std::set<int> result;

    std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
        std::inserter(result, result.end()), cmp());

    std::cout << *result.begin(); // will print 3

}
struct-cmp{
布尔运算符()(int i,const std::pair&p)const
{
返回istd::cout@Superlokkus@jrok我知道这篇文章大约晚了一年…我还是希望澄清这个问题。
当比较运算符过载时,MS Visual Studio存在问题。问题是有两种组合未被考虑:

struct cmp {
    bool operator()(const int& i, const std::pair<int, double>& p) const
    {
        return i < p.first;
    }
    bool operator()(const std::pair<int, double>& p, const int& i) const
    {
        return p.first < i;
    }
    bool operator()(const std::pair<int, double>& p1,
        const std::pair<int, double>& p2) const
    {
        return p1.first < p2.first;
    }
    bool operator()(const int& i1, const int& i2) const
    {
        return i1 < i2;
    }
};
struct-cmp{
布尔运算符()(常量int&i,常量std::pair&p)常量
{
返回i
通过插入最后两个运算符,我们插入了编译器获得差异所需的所有选项。事实上,我建议使用
const int&
,而不是像前两个运算符中所示的那样简单地使用
int
。对于小情况,这并不相关,但是当我们有非常大的对数组、int或ev时更糟糕的是,如果容器非常大,那么操作将是内存受限的,因为我们将有很多内存访问。通过使用它,我们传递参数的引用,而不需要复制参数,因此避免了复制操作,并使用完全不必要的另一组值填充缓存


最后一点,我发现@jrok提出的第一个解决方案在发布模式(MSVC 2013)下而不是在调试模式下完美编译是非常奇怪的。很高兴知道为什么!

我自己对如何编写比较谓词的轻微偏好是:

class KeyLess
{
    public:

      template< typename KeyType >
      static KeyType getKey( const KeyType& k ) 
      {  
          return k;
      }

      template< typename KeyType, typename ValueType >
      static KeyType getKey( std::pair< const KeyType, ValueType > const& p ) 
      {         
          return p.first;
      }

      template< typename L, typename R >
      bool operator()( const L& l, const R& r ) const
      {
          return getKey( l ) < getKey( r );
      }
};
类无键
{
公众:
模板
静态键类型getKey(constkeytype&k)
{  
返回k;
}
模板
静态键类型getKey(std::pairconst&p)
{         
返回p.first;
}
模板
布尔运算符()(常数L&L,常数R&R)常数
{
返回getKey(l)

您现在可以在您的代码中使用此选项。

我在这里没有看到任何
映射。@jrok请重新阅读问题..H2CO3对此表示抱歉。它说"我想问一下,是否可以提供一个示例,说明如何找到一个集合和地图键之间的差异。您显示的代码计算两个集合之间的差异。那么,您介意给出一个您所谈论的示例吗?@jrok我想找到一个集合和地图键之间的差异。没问题。老实说,though、 我会使用
boost::transform_迭代器
和作为lambda传递的简单比较器。是的,我知道,但我没有安装boost库,我想要一个自定义解决方案。顺便问一下,是否可以提供字符串的等效示例(字符串集和映射键作为字符串)?提前感谢。很抱歉,您的解决方案未使用MS Visual Studio Express 2013生成:错误C2664:“bool cmp::operator()(int,const std::pair&)const”:无法将参数2从“std::pair”转换为“int”错误C2664:“bool cmp::operator()(int,const std::pair&”)const':无法将参数1从“const int”转换为“const std::pair&”@Superlokkus您确定在comparator中有两个
运算符()
重载吗?错误消息似乎丢失了一个。@jrok是的,我刚刚从答案中复制了整个代码并添加了标题