C ++中的set :: key_comp vs set :: value_comp?

时间:2017-01-13 09:33:15

标签: c++ performance stl std stdset

C ++ set :: key_comp set :: value_comp 的区别是什么?转到cplusplus.com页面没有显着差异。 此外,在set :: key_comp&相关的set :: value_comp页面 最后一句是“(...)key_comp,它的兄弟成员函数value_comp是等价的。”

示例几乎相同:

http://www.cplusplus.com/reference/set/set/key_comp/

http://www.cplusplus.com/reference/set/set/value_comp/

3 个答案:

答案 0 :(得分:3)

key_comp定义容器中的顺序。

value_comp定义容器中的顺序。

std::set中,基本上,值是键,两者确实完全等价。但是在所有容器中都不是这样,例如std::map,或者,通常,您可以自己构建的容器,遵循C ++标准库容器的约定。

另请注意,http://en.cppreference.com/w/是C ++的高级参考。它几乎代表了标准。

答案 1 :(得分:3)

这些都是相同的,因为std::set必须满足Associative Container的要求,所以必须都可以使用它们。

这允许您编写适用于标准中任何关联容器std::setstd::mapstd::multisetstd::multimap的通用代码库)。

答案 2 :(得分:1)

keyvalue是容器内的不同实体时,会出现差异。

对于像set这样的容器,这两个术语意思相同。

同时,对于mapmultimap等容器,keyvalue是作为单个条目维护的单独实体。

这是一个显示它们如何不同的例子:

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

Live demo

正如我所提到的那样,value_compare函数对象的传递参数必须是value_type&类型,所以我与那些说这两个{{>>的不一致 {{ 1}}和set::key_comp可以在关联容器之间轻松兼容。