^_^ map基本函数汇总:
//C++ maps是一种关联式容器,包含“关键字/值”对
begin(); //返回指向map头部的迭代器
clear(); //删除所有元素
count(); //返回指定元素出现的次数
empty(); //如果map为空则返回true
end(); //返回指向map末尾的迭代器
equal_range(); //返回特殊条目的迭代器对
erase(); //删除一个元素
find(); //查找一个元素
get_allocator(); //返回map的配置器
insert(); //插入元素
key_comp(); //返回比较元素key的函数
lower_bound(); //返回键值>=给定元素的第一个位置
max_size(); //返回可以容纳的最大元素个数
rbegin(); //返回一个指向map尾部的逆向迭代器
rend(); //返回一个指向map头部的逆向迭代器
size(); //返回map中元素的个数
swap(); //交换两个map
upper_bound(); //返回键值>给定元素的第一个位置
value_comp(); //返回比较元素value的函数
#include
map m;//常用的 map的构造函数
map m;
//用insert函数插入pair数据
m.insert(pair(1, "Alice"));
m.insert(pair(2, "Lily"));
//用insert函数插入value_type数据
m.insert(map::value_type (3, "Lucy"));
m.insert(map::value_type (4, "Maike"));
//用数组方式插入数据
m[5] = "Rose";
m[6] = "Jack";
//----------
//在map中访问元素的方式:
map m;
m.insert(pair(8,9));
cout<first<<' '<second<<'\n'; //用->
pair
int mSize = m.size();
//前向迭代器
map::iterator iter1;
for(iter1 = m.begin(); iter1 != m.end(); iter1++)
cout<first<<' '<second<::reverse_iterator iter2;
for(iter2 = m.rbegin(); iter2 != m.rend(); iter2++)
cout<first<<" "<second<
//前向迭代器
map::iterator iter;
iter = m.find(1);
if(iter != m.end()) //1作为key在map中存在
cout<<"Find, the value is "<second<
3)lower_bound() 和 upper_bound() , 用来判定数据是否出现
//用迭代器删除1
map::iterator iter;
iter = m.find(1);
m.erase(iter);
//用关键字删除1 : 如果删除了会返回1,否则返回0
int n = m.erase(1);
//用迭代器,成片的删除 : 一下代码把整个map清空
m.erase(m.begin(), m.end());
//成片删除要注意: 删除区间是一个前闭后开的集合(STL的特性)
//一下子清空所有元素
m.clear();
注意加切记:
mymap.end();
mymap.rend();
这两个函数只是标记找没找到,不是返回最后一个元素!
//正确做法!!!
//输出map中的最后一个元素
map::reverse_iterator iter = m.rbegin(); //返回最后一个元素
if (iter != mymap.rend())
{
std::cout << iter->first << " => " << iter->second << '\n';
}
//错误做法!!!
//如果这样直接用会导致崩溃 !!
map::iterator iter2 = m.end(); //无法返回最后一个元素,因为end()是指向最后一个元素的下一个位置
std::cout << iter2->first << " => " << iter2->second << '\n';
//正确做法!!!
map::iterator iter3 = m.begin(); //返回第一个元素
if (iter3 != mymap.end())
{
std::cout << iter3->first << " => " << iter3->second << '\n';
}
unordered_map的底层实现是
哈希表。
这一规定从 C++ 11开始的,根据 C++ 11 标准的推荐,用 unordered_map
代替 hash_map
。map
对应的数据结构是 红黑树。红黑树是一种近似于平衡的二叉查找树,里面的数据是有序的。在红黑树上做查找操作的时间复杂度为 O(logN)。unordered_map
对应的数据结构是 哈希表。哈希表的特点是查找效率高,时间复杂度为常数级别 O(1), 但额外空间复杂度比map要高出许多。unordered_map
容器更合适。而如果对内存大小比较敏感或者要求存储的数据(key,vale)按照key的大小排序的话,则可以用 map
容器,map容器默认按照key从小到大排序。unordered_map
的用法和 map
大同小异#include
#include
#include
int main(int argc, char **argv) {
std::unordered_map map;
map.insert(std::make_pair(3, "C++"));
map.insert(std::make_pair(6, "Java"));
map.insert(std::make_pair(14, "Erlang"));
std::unordered_map::iterator it;
if ((it = map.find(6)) != map.end()) {
std::cout << it->second << std::endl;
}
return 0;
}
hashCode
和 equals
方法。其中 hashCode
方法便是为散列存储结构服务的,用来计算散列值;而 equals
方法则是用来判断两对象是否等价。由于所有的类都继承自 java.lang.Object
类,因此所有类相当于都拥有了这两个方法。unordered_map
中使用自定义的类,则必须为此类提供一个哈希函数和一个判断对象是否相等的函数(e.g. 重载 ==
运算符)。如:using std::string;
using std::cin;
using std::cout;
using std::endl;
using std::unordered_map;
class Person {
public:
string phone;
string name;
string address;
explicit Person() {}
explicit Person(string name, string phone, string address): name(name), phone(phone), address(address) {}
// overload operator==
bool operator==(const Person& p) {
return this->phone == p.phone && this->name == p.name
&& this->address == p.address;
}
inline friend std::ostream& operator<<(std::ostream& os, Person& p) {
os << "[Person] -> (" << p.name << ", " << p.phone << ", "
<< p.address << ")";
return os;
}
};
// declare hash
namespace std {
template <>
struct hash {
std::size_t operator()(const Person& p) const {
using std::size_t;
using std::hash;
using std::string;
// Compute individual hash values for first,
// second and third and combine them using XOR
// and bit shifting:
return ((hash()(p.phone)
^ (hash()(p.name) << 1)) >> 1)
^ (hash()(p.address) << 1);
}
};
}
unordered_map phoneMap;
void selectByPhone() {
string phone;
cout << "Input the phone number: "; cin >> phone;
unordered_map::iterator it;
int size = phoneMap.size();
for(int pc = 0; pc < size; pc++) {
if((it = phoneMap.find(phone)) != phoneMap.end()) {
cout << "Query result: " << it->second << endl;
return;
}
}
cout << "Query result : target_not_found" << endl;
}
参考:
https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html
https://www.sczyh30.com/posts/C-C/cpp-stl-hashmap/
https://blog.csdn.net/ajianyingxiaoqinghan/article/details/78542932(很详细)