目录
Map容器的基本操作
Map是什么?
自定义数据类型作为”键”并且进行自定义排序
根据上面的例子说明“如何进行自定义排序”?
无论是哪种容器,自定义数据类型应该注意什么?
Map容器的初始化
Map容器中元素的插入
Multimap容器中首个不重复的“键”查找
Map和multimap容器中compare函数句柄的使用
Map容器的最大容量(map容器最多可以装多少元素)
map容器中元素的删除操作
Map容器中的find函数
Multimap中查找有多少个重复值的count函数
Map容器的基本操作
Map是什么?
自动建立Key - value的对应。key 和 value可以是任意你需要的类型。
根据key值快速查找记录,查找的复杂度基本是Log(N),如果有1000个记录,最多查找10次,1,000,000个记录,最多查找20次。
Map是基于二叉树实现的,map的出现为我们提供了一个更加个性化的索引方式,以前我们的数组都是用Array[i]去索引第i个元素,这里的i是基本数据类型int型,但是我们map中使用的MapArray[Index]的Index可以是任意数据类型,这种索引方式很个性化不是!
自定义数据类型作为”键”并且进行自定义排序
// STL map和multimap的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; // 记住这种map初始化方式MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2;
}
根据上面的例子说明“如何进行自定义排序”?
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
};
用一个结构体作为map<key_type,value_type,default_Order>的第三参数default_Order,这个结构体中的东西很重要,我们为什么要重载()?因为我们采取的是默认排序方式,因此我们采用的是()而不是具体的>或<。
无论是哪种容器,自定义数据类型应该注意什么?
① 自定义数据类型直接用<<输出,是不对的,因为iostream中只有基础数据类型的输入输出方式,如果我们想要实现自定义数据类型的输出我们必须要重载专属的<<;
② 在容器中,我们有时需要对自定义数据类型进行排序查找,这些操作都是基于运算符<或>,==实现的,这时,我们就必须重载一下专属于自定义数据类型的<,>和==运算符;
③ 最重要的一点:我们无论什么运算符,本质上都是函数,容器中规定排序,查找均不可以改变对象,因此我们在重载运算符以及编写其他不修改被操作对象的函数时都应该加上const,正如我们上面编写的一样:“bool operator > (const PhoneBook& PhoneBookx) const ”,不仅函数参数是const类型,而且成员函数也是const类型的;
④ 我们为什么使用如下方式来重载<<运算符?
“friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)”
如果我们改成如下形式:
ostream& operator << (ostream& Output)
{ Output << this->name << "的手机号为" << this->PhoneNumber << endl; return Output;
}
那么我们调用重载运算符时,应该改为如下形式:
PhoneBook1.operator<<(cout); // 只输出一次
PhoneBook2.operator<<(PhoneBook1.operator<<(cout)); // 连续输出
这和我们平时使用的插入流运算符<<完全不同。这是为什么呢?
因为我们在将<<重载声明为成员函数时,函数传入默认参数this指针,我们使用<<就必须用this指针来调用(因为<<是结构体的成员函数)。
Map容器的初始化
#include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2},{PhoneBook4,179.2} };
}
Map容器中元素的插入
在map容器中,我们要明白的是:迭代器就相当于一个指针,指针指向的map容器地址有两个元素first,second分别对应key,value。
#include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ // map容器的初始化 PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2}}; // 元素的插入 MapArray1.insert(MapArray1.cend(), { PhoneBook4,179.2 }); PhoneBook PhoneBook5("孙七", 1212); pair<PhoneBook, float> PersonInf{ PhoneBook5,176.3 }; MapArray1.insert(MapArray1.cend(), PersonInf); // 用pair对象进行插入
}
我们注意这里的pair,pair类型它就相当于一个键值对,他有两个元素就相当于这两个元素被他用一个绳子捆绑起来,一调用pair对象,这两个值就成对出现。
Multimap容器中首个不重复的“键”查找
// STL map和multimap的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ // map容器的初始化 PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2}}; // 元素的插入 MapArray1.insert(MapArray1.cend(), { PhoneBook4,179.2 }); PhoneBook PhoneBook5("孙七", 1212); pair<PhoneBook, float> PersonInf{ PhoneBook5,176.3 }; MapArray1.insert(MapArray1.cend(), PersonInf); // 用pair对象进行插入 // 首个不重复元素的索引 multimap<PhoneBook, float, DefaultDescendOrder> MultimapArray{ {PhoneBook1,185},{PhoneBook1,186},{PhoneBook1,187} }; multimap<PhoneBook, float, DefaultDescendOrder>::iterator itor = MultimapArray.lower_bound(PhoneBook1); cout << itor->first << "身高为" << itor->second << endl; itor = MultimapArray.upper_bound(PhoneBook1); cout << (--itor)->first << "身高为" << (--itor)->second << endl; // 注意:upper_bound函数返回的迭代器是"从右边查找第一个想要查找对象的迭代器+1"
}
注意:这里的upper_bound返回的是什么?upper_bound函数返回的是"从右边查找第一个想要查找对象的迭代器+1"!
Map和multimap容器中compare函数句柄的使用
key_comp()函数与value_comp()函数的返回值都是函数句柄,用于比较map容器中的元素的key。
// STL map和multimap的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } bool operator < (const PhoneBook& PhoneBookx) const { return this->PhoneNumber < PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ // map容器的初始化 PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2}}; // 元素的插入 MapArray1.insert(MapArray1.cend(), { PhoneBook4,179.2 }); PhoneBook PhoneBook5("孙七", 1212); pair<PhoneBook, float> PersonInf{ PhoneBook5,176.3 }; MapArray1.insert(MapArray1.cend(), PersonInf); // 用pair对象进行插入 // 首个不重复元素的索引 multimap<PhoneBook, float, DefaultDescendOrder> MultimapArray{ {PhoneBook1,185},{PhoneBook1,186},{PhoneBook1,187} }; multimap<PhoneBook, float, DefaultDescendOrder>::iterator itor = MultimapArray.lower_bound(PhoneBook1); cout << itor->first << "身高为" << itor->second << endl; itor = MultimapArray.upper_bound(PhoneBook1); cout << (--itor)->first << "身高为" << (--itor)->second << endl; // 注意:upper_bound函数返回的迭代器是"从右边查找第一个想要查找对象的迭代器+1" // compare元素 map<PhoneBook, float, DefaultDescendOrder>::key_compare KeyCompareFunctionHandler = MapArray1.key_comp(); bool is_equal = KeyCompareFunctionHandler(MapArray1.begin()->first, (--MapArray1.end())->first); cout << "比较结果为" << is_equal << endl; map<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler = MapArray1.value_comp(); is_equal = ValueCompareFunctionHandler(*MapArray1.begin(), *(--MapArray1.end())); cout << "比较结果为" << is_equal << endl; // 切记:MapArray1.end()返回的迭代器指向“最后一个元素的后一个元素” multimap<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler1 = MultimapArray.value_comp(); is_equal = ValueCompareFunctionHandler1(*MultimapArray.begin(), *(++MultimapArray.begin())); cout << "比较结果为" << is_equal << endl;
}
注意:这里无论是key_comp还是value_comp都是比较的key值,这段代码可以说明:
multimap<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler1 = MultimapArray.value_comp(); is_equal = ValueCompareFunctionHandler1(*MultimapArray.begin(), *(++MultimapArray.begin())); // key相同,value不同cout << "比较结果为" << is_equal << endl; // 返回0
除此之外,key_comp和value_comp两个函数的参数也不一样。
Map容器的最大容量(map容器最多可以装多少元素)
// map容器中所能装载的最大元素
cout << MapArray1.max_size() << endl; // 返回82595524
map容器中元素的删除操作
// STL map和multimap的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } bool operator < (const PhoneBook& PhoneBookx) const { return this->PhoneNumber < PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ // map容器的初始化 PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2}}; // 元素的插入 MapArray1.insert(MapArray1.cend(), { PhoneBook4,179.2 }); PhoneBook PhoneBook5("孙七", 1212); pair<PhoneBook, float> PersonInf{ PhoneBook5,176.3 }; MapArray1.insert(MapArray1.cend(), PersonInf); // 用pair对象进行插入 // 首个不重复元素的索引 multimap<PhoneBook, float, DefaultDescendOrder> MultimapArray{ {PhoneBook1,185},{PhoneBook1,186},{PhoneBook1,187} }; multimap<PhoneBook, float, DefaultDescendOrder>::iterator itor = MultimapArray.lower_bound(PhoneBook1); cout << itor->first << "身高为" << itor->second << endl; itor = MultimapArray.upper_bound(PhoneBook1); cout << (--itor)->first << "身高为" << (--itor)->second << endl; // 注意:upper_bound函数返回的迭代器是"从右边查找第一个想要查找对象的迭代器+1" // compare元素 map<PhoneBook, float, DefaultDescendOrder>::key_compare KeyCompareFunctionHandler = MapArray1.key_comp(); bool is_equal = KeyCompareFunctionHandler(MapArray1.begin()->first, (--MapArray1.end())->first); cout << "比较结果为" << is_equal << endl; map<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler = MapArray1.value_comp(); is_equal = ValueCompareFunctionHandler(*MapArray1.begin(), *(--MapArray1.end())); cout << "比较结果为" << is_equal << endl; // 切记:MapArray1.end()返回的迭代器指向“最后一个元素的后一个元素” multimap<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler1 = MultimapArray.value_comp(); is_equal = ValueCompareFunctionHandler1(*MultimapArray.begin(), *(++MultimapArray.begin())); cout << "比较结果为" << is_equal << endl; // map容器中所能装载的最大元素 cout << MapArray1.max_size() << endl; // 返回82595524 // map容器中删除元素 MapArray1.erase(MapArray1.begin()); MapArray1.erase(PhoneBook2); MapArray1.erase(MapArray1.begin(), MapArray1.end()); // erase删除的是[MapArray1.begin(), MapArray1.end())之间的元素,注意区间的开闭 bool _is_empty_ = MapArray1.empty(); cout << _is_empty_ << endl;
}
注意:使用erase删除一段连续的元素时,删除的是[iterator1,iterator2)之间的元素,注意区间的开闭。
Map容器中的find函数
// STL map和multimap的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } bool operator < (const PhoneBook& PhoneBookx) const { return this->PhoneNumber < PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ // map容器的初始化 PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2}}; // 元素的插入 MapArray1.insert(MapArray1.cend(), { PhoneBook4,179.2 }); PhoneBook PhoneBook5("孙七", 1212); pair<PhoneBook, float> PersonInf{ PhoneBook5,176.3 }; MapArray1.insert(MapArray1.cend(), PersonInf); // 用pair对象进行插入 // 首个不重复元素的索引 multimap<PhoneBook, float, DefaultDescendOrder> MultimapArray{ {PhoneBook1,185},{PhoneBook1,186},{PhoneBook1,187} }; multimap<PhoneBook, float, DefaultDescendOrder>::iterator itor = MultimapArray.lower_bound(PhoneBook1); cout << itor->first << "身高为" << itor->second << endl; itor = MultimapArray.upper_bound(PhoneBook1); cout << (--itor)->first << "身高为" << (--itor)->second << endl; // 注意:upper_bound函数返回的迭代器是"从右边查找第一个想要查找对象的迭代器+1" // compare元素 map<PhoneBook, float, DefaultDescendOrder>::key_compare KeyCompareFunctionHandler = MapArray1.key_comp(); bool is_equal = KeyCompareFunctionHandler(MapArray1.begin()->first, (--MapArray1.end())->first); cout << "比较结果为" << is_equal << endl; map<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler = MapArray1.value_comp(); is_equal = ValueCompareFunctionHandler(*MapArray1.begin(), *(--MapArray1.end())); cout << "比较结果为" << is_equal << endl; // 切记:MapArray1.end()返回的迭代器指向“最后一个元素的后一个元素” multimap<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler1 = MultimapArray.value_comp(); is_equal = ValueCompareFunctionHandler1(*MultimapArray.begin(), *(++MultimapArray.begin())); cout << "比较结果为" << is_equal << endl; // map容器中所能装载的最大元素 cout << MapArray1.max_size() << endl; // 返回82595524 // map容器中删除元素 MapArray1.erase(MapArray1.begin()); MapArray1.erase(PhoneBook2); MapArray1.erase(MapArray1.begin(), MapArray1.end()); // erase删除的是[MapArray1.begin(), MapArray1.end())之间的元素,注意区间的开闭 bool _is_empty_ = MapArray1.empty(); cout << _is_empty_ << endl; // map容器中元素的查找 map<PhoneBook, float, DefaultDescendOrder>::iterator itor1 = MapArray.find(PhoneBook1); cout << itor1->first << endl; // 这里我们要注意的是,我们不可以使用适用于其他容器查找的find函数,因为我们的map容器中的元素是以key-value的形式存在的,这里不存在适用于key-value的==符号重载
}
Multimap中查找有多少个重复值的count函数
// STL map和multimap的基本操作.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
// #include <iostream>
#include <map>
#include <string>
using namespace std; struct PhoneBook
{ string name; long PhoneNumber; PhoneBook(const string& name, const long& PhoneNumber) { this->name = name; this->PhoneNumber = PhoneNumber; } bool operator == (string& name) const { return this->name == name; } bool operator > (const PhoneBook& PhoneBookx) const { return this->PhoneNumber > PhoneBookx.PhoneNumber; } bool operator < (const PhoneBook& PhoneBookx) const { return this->PhoneNumber < PhoneBookx.PhoneNumber; } friend ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx);
};
ostream& operator << (ostream& Output, const PhoneBook& PhoneBookx)
{ Output << PhoneBookx.name << "的电话号码为" << PhoneBookx.PhoneNumber << endl; return Output;
}
struct DefaultDescendOrder
{ bool operator()(const PhoneBook& PhoneBook1, const PhoneBook& PhoneBook2) const { return PhoneBook1.PhoneNumber > PhoneBook2.PhoneNumber; }
}; int main()
{ // map容器的初始化 PhoneBook PhoneBook1("张三", 110), PhoneBook2("李四", 120), PhoneBook3("王五", 114), PhoneBook4("赵六", 119); map<PhoneBook, float, DefaultDescendOrder> MapArray; MapArray[PhoneBook1] = 185.2; MapArray[PhoneBook2] = 178.2; MapArray[PhoneBook3] = 195.2; MapArray[PhoneBook4] = 179.2; map< PhoneBook, float, DefaultDescendOrder> MapArray1{ {PhoneBook1,185.2},{PhoneBook2,178.2},{PhoneBook3,195.2}}; // 元素的插入 MapArray1.insert(MapArray1.cend(), { PhoneBook4,179.2 }); PhoneBook PhoneBook5("孙七", 1212); pair<PhoneBook, float> PersonInf{ PhoneBook5,176.3 }; MapArray1.insert(MapArray1.cend(), PersonInf); // 用pair对象进行插入 // 首个不重复元素的索引 multimap<PhoneBook, float, DefaultDescendOrder> MultimapArray{ {PhoneBook1,185},{PhoneBook1,186},{PhoneBook1,187} }; multimap<PhoneBook, float, DefaultDescendOrder>::iterator itor = MultimapArray.lower_bound(PhoneBook1); cout << itor->first << "身高为" << itor->second << endl; itor = MultimapArray.upper_bound(PhoneBook1); cout << (--itor)->first << "身高为" << (--itor)->second << endl; // 注意:upper_bound函数返回的迭代器是"从右边查找第一个想要查找对象的迭代器+1" // compare元素 map<PhoneBook, float, DefaultDescendOrder>::key_compare KeyCompareFunctionHandler = MapArray1.key_comp(); bool is_equal = KeyCompareFunctionHandler(MapArray1.begin()->first, (--MapArray1.end())->first); cout << "比较结果为" << is_equal << endl; map<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler = MapArray1.value_comp(); is_equal = ValueCompareFunctionHandler(*MapArray1.begin(), *(--MapArray1.end())); cout << "比较结果为" << is_equal << endl; // 切记:MapArray1.end()返回的迭代器指向“最后一个元素的后一个元素” multimap<PhoneBook, float, DefaultDescendOrder>::value_compare ValueCompareFunctionHandler1 = MultimapArray.value_comp(); is_equal = ValueCompareFunctionHandler1(*MultimapArray.begin(), *(++MultimapArray.begin())); cout << "比较结果为" << is_equal << endl; // map容器中所能装载的最大元素 cout << MapArray1.max_size() << endl; // 返回82595524 // map容器中删除元素 MapArray1.erase(MapArray1.begin()); MapArray1.erase(PhoneBook2); MapArray1.erase(MapArray1.begin(), MapArray1.end()); // erase删除的是[MapArray1.begin(), MapArray1.end())之间的元素,注意区间的开闭 bool _is_empty_ = MapArray1.empty(); cout << _is_empty_ << endl; // map容器中元素的查找 map<PhoneBook, float, DefaultDescendOrder>::iterator itor1 = MapArray.find(PhoneBook1); cout << itor1->first << endl; // 这里我们要注意的是,我们不可以使用适用于其他容器查找的find函数,因为我们的map容器中的元素是以key-value的形式存在的,这里不存在适用于key-value的==符号重载 // multimap容器查找key相同的元素个数 int KeyRepeatedNumber = MultimapArray.count(PhoneBook1); // 参数为key cout << "key为PhoneBook1的元素个数为" << KeyRepeatedNumber << endl;
}
注意:count函数的参数是key