为什么set_symmetric_difference无法与比较器一起使用
Why set_symmetric_difference fails to work with comparater?
// Example program
#include <iostream>
#include <string>
#include <set>
#include <map>
#include <algorithm>
struct cmp {
bool operator()(std::string i, const std::pair<std::string,std::string>& p) const
{
return i < p.first;
}
bool operator()(const std::pair<std::string, std::string>& p, std::string i) const
{
return p.first < i;
}
};
int main(){
std::set<std::string> s1 {"--name", "--id"}; //Conditionally defined mandatory parameters
std::map<std::string, std::string> s2 { {"--name","Admin"}, {"--group","Group1"}}; //options given by user
std::set<std::string> result;
std::set_difference(s1.begin(), s1.end(), s2.begin(), s2.end(),
std::inserter(result, result.end()), cmp());
std::cout << *result.begin();
}
我希望输出能够使用户错过任何强制性参数,它应该丢弃错误,同时,如果用户提到了强制性ARG的其他任何额外参数,则再次期望再次出现错误。
set_symmetric_difference也无法使用。
它需要能够比较您给出的元素的任何组合,包括字符串到字符串和对配对。
struct cmp {
bool operator()(const std::string &i1, const std::string &i2)
{
return i1 < i2;
}
bool operator()(const std::pair<std::string, std::string> &p1, const std::pair<std::string, std::string> &p2)
{
return p1.first < p2.first;
}
bool operator()(const std::string &i, const std::pair<std::string, std::string> &p)
{
return i < p.first;
}
bool operator()(const std::pair<std::string, std::string> &p, const std::string &i)
{
return p.first < i;
}
};
输出:
- ID
来自文档http://en.cppreference.com/w/cpp/algorithm/set_difference
比较函数的签名应等于以下内容:
bool cmp(const type1&amp; a,const type2&amp; b(;
签名不需要具有const&amp;,但是函数对象不得修改传递给它的对象。Type1和Type2的类型必须是这样,可以将类型InputIt1和Inputit2的对象删除,然后隐式转换为type1和type2。
我只是使用一个比较功能尝试了它,但它不起作用。如果我评论任何功能,则无效。最后一行似乎意味着,如果我测试的编译器/STD实现是正确的,则两个迭代器都必须隐式转换为两种类型。但是我宁愿只提供所有四个组合。
您的代码在我的计算机和IDEONE上工作。
我查看了C 规范的工作草案,尽管我看不到用户提供的比较器的要求,这会使行为变得不确定,但对我来说似乎很奇怪的是,传递给set_difference的比较器是一个与Compare
模板类型参数到STD :: MAP和STD ::SET。
如果我要解决此问题,我将使用Boost Transform_iterator将用户提供的选项映射迭代器映射到STD :: String键(选项名称(。在C 地图中查看迭代键。然后,我将使用默认比较器,STD :: Less:
#include <algorithm>
#include <cassert>
#include <cstdlib>
#include <iostream>
#include <map>
#include <set>
#include <string>
#include <utility>
#include <boost/iterator/transform_iterator.hpp>
int main(){
std::set<std::string> standard_option_names {"--name", "--id"};
std::map<std::string, std::string> user_supplied_options { {"--name", "Admin"}, {"--group", "Group1"} };
std::set<std::string> different_option_names;
auto get_option_name = [](const std::pair<const std::string, std::string>& p) -> const std::string& {
return p.first;
};
std::set_symmetric_difference(
standard_option_names.cbegin(), standard_option_names.cend(),
boost::make_transform_iterator(user_supplied_options.cbegin(), get_option_name), boost::make_transform_iterator(user_supplied_options.cend(), get_option_name),
std::inserter(different_option_names, different_option_names.end()));
for (const std::string& different_option_name : different_option_names) {
std::cout << different_option_name;
if (standard_option_names.find(different_option_name) == standard_option_names.end()) {
std::cout << " (unknown option)";
} else {
assert(user_supplied_options.find(different_option_name) == user_supplied_options.end());
std::cout << " (mandatory option not supplied)";
}
std::cout << 'n';
}
return EXIT_SUCCESS;
}
导致:
- 组(未知选项( - ID(不提供强制选项(
- std::设置自定义比较器
- C++中"std::sort"比较器的不同类型
- 将 std::set 与基于键的比较器一起使用
- 带自定义比较器的最小优先级队列
- 函数类作为比较器
- 优先级队列自定义比较器
- 什么是自定义比较器以及如何在 C++ 的排序函数中使用它?
- 没有默认构造函数作为模板参数的自定义比较器
- set_intersection使用自定义设置比较器
- 如何为集合 c++ 建立比较器
- C++复杂情况的比较器通过参数问题
- 对于BTreeMap和其他依赖于Ord的东西,是否有等效于C++比较器对象?
- 对没有比较器或λ函数的向量进行排序?
- "operator()"在重载运算符方法中是什么意思,在priority_queue(STL)中用作C++中的比较器?
- 用户定义的结构是否有默认C++比较器?
- C++设置了一个用于排序的比较器和另一个用于唯一性的比较器
- gtest 期望无序元素与自定义比较器/匹配器一起使用
- 如何在 C++11 中将 std::max 与自定义比较器一起使用?
- 为什么set_symmetric_difference无法与比较器一起使用
- 如何使用自定义比较器函数将所有字谜组合在一起