映射表(map)
在每个条目被插入时将之按键进行排序。取迭代器指向值时将返回value_type结构,它有两个数据成员:first,second。访问first获得键的数据,访问second获得值的数据。
除了迭代器访问外,映射表还提供通过它们的键值随机访问的接口(可以用数组进行访问)。
1 #pragma warning (disable:4786) 2 #include<iostream> 3 #include<map> 4 #include<string> 5 #include<algorithm> 6 using namespace std; 7 8 template<typename F,typename S> 9 class value_equals 10 { 11 private: 12 S second; 13 public: 14 value_equals(const S& s) :second(s){} 15 bool operator()(pair<const F, S> elem){ return elem.second == second; } 16 }; 17 18 typedef map<int, string> isMap; 19 typedef isMap::value_type isValType; 20 typedef isMap::iterator isMapItor; 21 22 void main() 23 { 24 isMap c; 25 26 c.insert(isValType(100, "OneHundred")); 27 c.insert(isValType(3, "Three")); 28 c.insert(isValType(150, "OneHundredFifty")); 29 c.insert(isValType(99, "NinetyNine")); 30 31 for (isMapItor itor = c.begin(); itor != c.end(); ++itor) 32 { 33 cout << "Key = " << itor->first << ",Value = " << itor->second << endl; 34 } 35 36 //你可以通过关联数组方式访问映射表 37 cout << "Key 3 displays value " << c[3].c_str() << endl; 38 //或者以关联数组方式插入键/值对 39 c[123] = "OneHundredTwentyThree"; 40 //基于键找到并删除一个特定值 41 isMapItor pos = c.find(123); 42 if (pos != c.end()) 43 c.erase(pos); 44 45 //基于值找到并删除元素 46 pos = find_if(c.begin(), c.end(), value_equals<int, string>("NinetyNine")); 47 if (pos != c.end()) 48 c.erase(pos); 49 //如果你需要在遍历链表时删除元素 50 for (isMapItor itor = c.begin(); itor != c.end();) 51 { 52 if (itor->second == "Three") 53 c.erase(itor++); 54 else 55 ++itor; 56 } 57 }
注意 !!
for (isMapItor itor = c.begin(); itor != c.end();) { if (itor->second == "Three") c.erase(itor++); else ++itor; }
如果你需要迭代遍历并手工在映射表中删除对象,需要注意。STL设计者没有像其他容器那样提供一个erase()函数来删除特定元素并返回下一个有效位置。所以,我们不得不在删除后重新排序,以使我们的迭代器不会失效。在这个例子中,与在for循环语句中步进迭代器不同,我们在循环体内以条件语句的方式完成迭代器工作。注意,当一个元素需要删除,我们在将迭代器作为参数传递给erase()后使用后置递增运算符步进此迭代器。但如果此元素不需要删除,我们使用标准前置递增运算符。因为操作顺序的不同,这个方法允许在不使用临时迭代器进行重新排序的情况下进行安全的迭代操作。