C ++ 中 set :: key_comp 与 set :: value_comp 的区别是什么?转到cplusplus.com页面没有显着差异。 此外,在set :: key_comp&相关的set :: value_comp页面 最后一句是“(...)key_comp,它的兄弟成员函数value_comp是等价的。”
示例几乎相同:
答案 0 :(得分:3)
key_comp
定义容器中键的顺序。
value_comp
定义容器中值的顺序。
在std::set
中,基本上,值是键,两者确实完全等价。但是在所有容器中都不是这样,例如std::map
,或者,通常,您可以自己构建的容器,遵循C ++标准库容器的约定。
另请注意,http://en.cppreference.com/w/是C ++的高级参考。它几乎代表了标准。
答案 1 :(得分:3)
这些都是相同的,因为std::set
必须满足Associative Container的要求,所以必须都可以使用它们。
这允许您编写适用于标准中任何关联容器(std::set
,std::map
,std::multiset
,std::multimap
的通用代码库)。
答案 2 :(得分:1)
当key
和value
是容器内的不同实体时,会出现差异。
对于像set
这样的容器,这两个术语意思相同。
同时,对于map
或multimap
等容器,key
和value
是作为单个条目维护的单独实体。
这是一个显示它们如何不同的例子:
std::set<int> myset;
int highest1, highest2, highest3;
typedef map<int, int> MyMap;
MyMap mymap;
std::set<int>::key_compare myCompKeyForSet = myset.key_comp();
std::set<int>::value_compare myCompValForSet = myset.value_comp();
MyMap::key_compare myCompKeyForMap = mymap.key_comp();
MyMap::value_compare myCompValForMap = mymap.value_comp();
for (int i=0; i<=5; i++) {
myset.insert(i);
mymap.insert(make_pair(i, 2*i));
}
//////SET///////
highest1=*myset.rbegin();
std::set<int>::iterator it=myset.begin();
while ( myCompKeyForSet(*it, highest1) ) it++;
std::cout << "\nhighest1 is " << highest1; // prints 5
highest2 = *myset.rbegin();
it=myset.begin();
while ( myCompValForSet(*it, highest2) ) it++;
std::cout << "\nhighest2 is " << highest2; // prints 5
//////MAP///////
MyMap::iterator it2 = mymap.begin();
highest3 = mymap.rbegin()->first;
while ( myCompKeyForMap((it2->first), highest3) ) it2++;
std::cout << "\nhighest3 is " << highest3; // prints 5
std::pair<int,int> highest4 = *mymap.rbegin(); //must be defined as map's `value_type`
it2 = mymap.begin();
while ( myCompValForMap(*(it2), highest4) ) it2++; // takes `value_type` which is `pair<int, int>` in this case.
std::cout << "\nhighest4 is " << highest4.second; // prints 10
正如我所提到的那样,value_compare
函数对象的传递参数必须是value_type&
类型,所以我与那些说这两个{{>>的不一致 {{ 1}}和set::key_comp
可以在关联容器之间轻松兼容。