map以自定義型別當Key
阿新 • • 發佈:2019-02-04
關於map的定義:
template < class Key, class T, class Compare = less<Key>,
class Allocator = allocator<pair<const Key,T> > > class map;
第一個template引數被當做元素的key,第二個template引數被當作元素的value。Map的元素型別Key和T,必須滿足以下兩個條件:
1.key/value必須具備assignable(可賦值的)和copyable(可複製的)性質。
2.對排序準則而言,key必須是comparable(可比較的)。
第三個template引數可有可無,用它來定義排序準則。這個排序準則必須定義為strict weak ordering。元素的次序由它們的key決定,和value無關。排序準則也可以用來檢查相等性:如果兩個元素的key彼此的都不小於對方,則兩個元素被視為相等。如果使用未傳入特定排序準則,就使用預設的less排序準則——以operator<來進行比較。
所謂“排序準則”,必須定義strict weak ordering,其意義如下:
1.必須是“反對稱性的”。
2.必須是“可傳遞的”。
3.必須是“非自反的”。
按照定義的要求:
我們有兩種方法以自定義型別當key:
1.為自定義型別過載operator<,map的第三個引數為預設仿函式less<key>。
- #include <iostream>
- #include <map>
- #include <string>
- using namespace std;
- class test
- {
- public:
- bool operator<(const test& a)const;
- //private:
- int nA;
- int nB;
- };
- bool test::operator<(const test& a)const
- {
- if(this->nA < a.nA)
- return true;
- else
- {
- if(this->nA == a.nA && this->nB < a.nB)
- return true;
- else
- return false;
- }
- }
- int main()
- {
- map<test, string> myTestDemo;
- test tA;
- tA.nA = 1;
- tA.nB = 1;
- test tB;
- tB.nA = 1;
- tB.nB = 2;
- myTestDemo.insert(pair<test, string>(tA, "first!"));
- myTestDemo.insert(pair<test, string>(tB, "second!"));
- map<test, string>::iterator myItr = myTestDemo.begin();
- cout << "itr begin test nA:" << myItr->first.nA << endl;
- cout << "itr begin test nB:" << myItr->first.nB << endl;
- cout << "itr begin test string:" << myItr->second << endl;
- return 1;
- }
2. 不使用map的第三個引數為預設仿函式less<key>,自己編寫一個比較仿函式。
- #include <iostream>
- #include <map>
- using namespace std;
- struct keyOfMap
- {
- int firstOfKey;
- int secondOfKey;
- };
- struct myMapFunctor
- {
- bool operator()(const keyOfMap& k1, const keyOfMap& k2) const
- {
- if(k1.firstOfKey < k2.firstOfKey)
- return true;
- else
- return false;
- }
- };
- int main()
- {
- map<keyOfMap, string, myMapFunctor> test;
- keyOfMap temp1;
- keyOfMap temp2;
- temp1.firstOfKey = 1;
- temp1.secondOfKey = 1;
- temp2.firstOfKey = 2;
- temp2.secondOfKey = 2;
- test.insert(make_pair<keyOfMap, string>(temp1, "first"));
- test.insert(make_pair<keyOfMap, string>(temp2, "second"));
- map<keyOfMap, string, myMapFunctor>::iterator begin = test.begin();
- cout << begin->first.firstOfKey << begin->first.secondOfKey << begin->second << endl;
- return 1;
- }