C++ map详解

来源:互联网 发布:telnet本机ip端口不通 编辑:程序博客网 时间:2024/06/11 09:32

1、map 对象的定义

map<k, v> m;            创建一个名为m的空map对象,其键和值得类型分别为k和vmap<k, v> m(m1);        创建m1的副本m,m与m1必须有相同的键类型和值类型map<k, v> m(b, e);      创建map类型的对象m,存储迭代器b和e标记的范围内所有元素的副本。元素的类型必须能转换为pair<const k, v>

2、map类定义的类型

map<K, V>::key_type     在map容器中,用做索引的键的类型map<K, V>::mapped_type  在map容器中,键所关联的值的类型map<K, V>::value_type   一个pair类型,它的first元素具有const map<K, V>::key_type类型,而second元素则为map<K, V>::mapped_type类型

map迭代器进行解引用将产生pair类型的对象

3、使用下标访问map对象

map<string, int> word_count;        //empty map//insert default initialized element with key Anna; then assign 1 to its valueword_count["Anna"] = 1;

上述代码将发生以下事情:

  • 在word_count中查找键为Anna的元素,没有找到。
  • 将一个新的键-值对插入到word_count中。它的键是const string类型的对象,保存Anna.而它的值则采用值初始化,这就意味着在本例中值为0。
  • 将这个新的键-值对插入到word_count中
  • 读取新插入的元素,并将它的值赋为1
int main(){    map<string, int> word_count;    string word;    cout << word_count["Anna"];               // print 0    ++word_count["Anna"];    cout << word_count["Anna"] << endl;       // print 1    return 0;}

4、map::insert的使用

  • m.insert(e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则插入一个值为e.second的新元素;如果该键在m中已存在,则保持m不变。该函数返回一个pair类型对象,包含指向键为e.first的元素的map迭代器,以及一个bool类型的对象,表示是否插入了该元素。
  • m.insert(beg, end) beg和end是标记元素范围的迭代器,其中的元素必须为m.value_type类型的键-值对。对于该范围内的所有元素,如果它的键在m中不存在,则将该键及其关联的值插入到m。返回void类型
  • m.insert(iter, e) e是一个用在m上的value_type类型的值。如果键(e.first)不在m中,则创建新元素,并以迭代器iter为起点搜索新元素存储的位置。返回一个迭代器,指向m中具有给定键的元素
//if Anna not already in word_count, inserts new element with value 1word_count.insert(map<string, int>::value_type("Anna", 1));//word_count.insert(make_pair("Anna", 1));与上一行效果一样

5、查找并读取map中的元素
不修改map对象的查询操作

  • m.count(k) 返回m中k的出现次数。对于mpa对象,count成员的返回值只能是0或1。map容器只允许一个键对应一个实例,所以count可有效地表明一个键是否存在。如果返回值非0,则可以使用下标操作符来获取该键所关联的值,而不必担心这样做会在map中插入新元素。
  • m.find(k) 如果m容器中存在按k索引的元素,则返回指向该元素的迭代器。如果不存在,则返回超出末端迭代器

6、从map中删除元素

  • m.erase(k) 删除m中键为k的元素。返回size_type类型的值,表示删除的元素个数
  • m.erase(p) 从m中删除迭代器p所指向的元素。p必须指向m中确实存在的元素,而且不能等于m.end()。返回void类型
  • m.erase(b, e) 从m中删除一段范围内的元素,该范围由迭代器对b和e标记。b和e必须标记m中的一段有效范围:即b和e都必须指向m中的元素或最后一个元素的下一个位置。而且,b和e要么相等(此时删除的范围为空),要么b所指向的元素必须出现在e所指向的元素之前。返回void类型

7、map 对象的迭代遍历
与其他容器一样, map同样提供begin和end运算,以生成用于遍历整个容器的迭代器

map<string, int> word_count;...//get iterator positioned on the first elementmap<string, int>::const_iterator map_it = word_count.begin();//for each element in the mapwhile (map_it != word_count.end()) {    //print the element key, value pairs    cout << map_it->first << " occurs " << map_it->second << "times" << endl;    ++map_it;  // increment iterator to denote the next element} 
0 0
原创粉丝点击