STL——map

map

map 容器是关联容器的一种。在关联容器中,对象的位置取决于和它关联的键的值。键可以是基本类型,也可以是类类型。关键词起到索引的作用,值则是索引相关联的数据。map是以红黑树为底层机制完成的,插入删除等操作都在O(logn)时间内完成。

map 类模板定义在 map 文件头中,它定义了一个保存 T 类型对象的 map,每个 T 类型的对象都有一个关联的 K 类型的键。容器内对象的位置是通过比较键决定的。可以用适当的键值从 map 容器中检索对象。

 

为了可以在必要时生成默认的元素,容器保存的对象通常需要定义一个默认的构造函数。当两个对象的 secondname 不同时,成员函数 operator<() 通过比较 secondname 来确定对象的顺序。如果 secondname 相等,比较结果就由 firstname 决定。string 类定义了 operator<(),因而可以用默认的 less 来比较。

为了可以用这种对象作为 map 容器的键,必须为这个类定义 operator<()。

map的所有元素都是pair,不能拥有两个键值相同的元素。

map的创建:

map 类模板有 4 个类型参数,但一般只需要指定前两个模板参数的值。

template < class Key,                                     // map::key_type 键

           class T,                                       // map::mapped_type 值

           class Compare = less,                     // map::key_compare 比较器

           class Alloc = allocator >    // map::allocator_type 分配内存的分配器

           > class map;

map的创建与初始化

map students;

map students{{"csc”,20},{"qjt”,21}};

map students{make_pair("csc”,20), make_pair("qjt",21)};

map students {people}; // map people;

map students {people.begin(), people.end()};

map students {begin(people), end(people)};

 

插入元素:

students["csc"] = 21; // []方式是通过重载[]操作符来实现的,它直接进行插入或覆盖。没有元素就插入,已有的元素就进行值的覆盖。如果没有赋值➕没有元素就创建并付给一个初值0。

students.insert(make_pair(“dmq",18));

students.emplace(make_pair(“zbj”,35)); //在适当的位置直接构造新元素,避免了移动与复制操作。(C++11)

auto it3 = students.emplace_hint(students.begin(), make_pair("csc",12)); // (C++11)

ps:emplace_hint()成员函数

template

iterator emplace_hint(const_iterator position, Args&&... args)

emplace_hint() 的返回值是指向新元素的迭代器;如果没有插入,返回的是和这个键匹配的现有元素的迭代器

必须为前者提供一个指示元素生成位置的迭代器,如果位置指向将跟随插入元素的元素(或者到最后,如果它是最后一个元素),则函数将优化其插入时间。注意,这并不强制新元素位于map容器中的那个位置(map中的元素总是遵循特定的顺序)。

ps2:insert()与emplace()对已有的元素不会进行覆盖,但有方法能在使用insert()或emplace()后进行值的覆盖。

insert()与emplace()会返回一个pair对象,pair 的成员变量 first 是一个指向插入元素或阻止插入的元素的迭代器;成员变量 second 是个布尔值,如果元素插入成功,second 就为 true。

#include 
#include 
#include 
using namespace std;int main(){map students;students["csc"] = 20;auto it1 = students.insert(make_pair("csccc",18));auto it2 = students.emplace(make_pair("csc",12));cout << "Insert: " << it1.second;cout << " ,name: " << (it1.first)->first ;cout << " ,age: " << (it1.first)->second << endl;cout << "Insert: " << it2.second;cout << " ,name: " << (it2.first)->first ;cout << " ,age: " << (it2.first)->second << endl;if(!it2.second){ //如果存在it2.first->second = 666; //利用返回的迭代器修改值}for(auto it = students.begin(); it != students.end();it++)cout << "name: " << (*it).first << " ,age: " << (*it).second << endl;return 0;
}

运行结果:

 

删除元素:

students.clear();  // 移除所有元素。

students.erase("csc");  // 删除键为”csc”的元素,返回删除元素的个数,map中返回0或1。

students.erase(students.begin());  // 删除当前迭代器位置的元素,返回被删除元素的下一个位置,删除最后一个元素的话返回的是结束迭代器。

auto it = students.erase(students.begin(),--students.end());  // 删除迭代器间的所有元素,返回最后一个被删除元素的下一个位置,删除最后一个元素的话返回的是结束迭代器。

if(people.erase("csc"))

    cout << “remove success." << std::endl;

auto it = students.erase(students.begin());

    cout << “last name is " << it->first << endl;

 

迭代器与遍历:(与其他容器相同)STL序列容器——vector

 

常用成员函数:

1.find()  返回指向查找的键的迭代器,没找到该元素的话返回结束迭代器 。

auto iter = students.find("qjt");if(iter != students.end())cout << "find name is " << iter->first << " ,age: " << iter->second << endl;elsecout << "not find name is qjt" << endl;

2.count() 返回指定元素出现的次数(map中只会返回0或1)

if(students.count("dmq")){auto iter1 = students.find("dmq");cout << "Map contains the name " << iter1->first << " ,age: " << iter1->second << endl;
}else{students.emplace(make_pair("dmq",17));
}

3.size() 返回map中的元素个数

4.empty() 如果map为空则返回true,反之false


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部