1.map/multimap容器簡介
map/multimap容器,也是一個關聯式容器,底層通過二叉樹實現。
map/multimap容器中保存的是對組(pair)數據。對組(pair)的第一個元素鍵值key,起到索引作用,第二個元素value為實值;
map容器第一個鍵值不能重復,出現重復則會自動忽略該數據,multimap則不受此限制;
map/multimap插入數據時會根據鍵值key進行排序;
2.map/multimap容器構造函數與賦值
-
map/multimap構造函數:
map p;無參構造
map(begin,end);//區間賦值
map(const map &p);//拷貝構造,type> -
map/multimap賦值:
重載"=": map &operator=(); -
map/multimap插入數據:
inset()
使用示例:
#include
#include
using namespace std;
#if 0
void Printmap(map& p)
{
for (map::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "tvalue=" < (*ptr).second < endl;
}
}
void test()
{
mapp1;
p1.insert(pair(1, "小王"));
p1.insert(pair(3,"小李"));
p1.insert(pair(2, "小劉"));
p1.insert(pair(8, "小紅"));
p1.insert(pair(5, "小王"));
p1.insert(pair(5, "小李"));
cout < "無參構造,插入數據示例:" < endl;
Printmap(p1);
mapp2(p1.begin(), p1.end());
cout < "區間賦值p2" < endl;
Printmap(p2);
mapp3(p1);
cout < "拷貝構造p3" < endl;
Printmap(p3);
}
//multimap示例:
void Printmultimap(multimap& p)
{
for (multimap::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "tvalue=" < (*ptr).second < endl;
}
}
void test02(void)
{
multimapmp;
mp.insert(pair(1, "小王"));
mp.insert(pair(3, "小李"));
mp.insert(pair(2, "小劉"));
mp.insert(pair(8, "小紅"));
mp.insert(pair(5, "小王"));
mp.insert(pair(5, "小李"));
Printmultimap(mp);
}
int main()
{
cout < "tmap示例:" < endl;
test();
cout < "ntmultimap示例" < endl;
test02();
system("pause");
}
3.map/multimap獲取容器元素個數和互換數據
map/multimap獲取容器元素個數和互換數據:
size(); --獲取元素個數
empty(); --判斷容器是否為空
swap(); --互換數據
使用示例:
#include
#include
using namespace std;
void PrintMap(map& p)
{
for (map::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "tvalue=" < ptr-?>second < endl;
}
}
void test()
{
mapp1;
p1.insert(pair(1, "小王"));
p1.insert(pair(3, "小李"));
p1.insert(pair(2, "小劉"));
p1.insert(pair(8, "小紅"));
p1.insert(pair(5, "小王"));
p1.insert(pair(5, "小李"));
if (p1.empty())
{
cout < "p1容器為空!" < endl;
}
else
{
cout < "p1容器不為空!" < endl;
}
cout < "p1成員個數:" < p1.size() < endl;
PrintMap(p1);
mapp2;
p2.insert(pair(10, "AA"));
p2.insert(pair(13, "BB"));
p2.insert(pair(12, "CC"));
cout < "p2成員個數:" < p2.size() < endl;
PrintMap(p1);
cout < "互換元素" < endl;
p1.swap(p2);
cout < "p1成員個數:" < p1.size() < endl;
PrintMap(p1);
cout < "p2成員個數:" < p2.size() < endl;
PrintMap(p2);
}
int main()
{
test();
system("pause");
}
4.map/multimap插入元素和刪除元素
map/multimap插入元素
insert(elem) --插入單個元素
insert(begin,end);//插入一個區間
map/multimap刪除元素:
erase(pos); --刪除指定位置的數據,返回下一個成員的迭代器
erase(begin,end);--刪除一個區間
erase(key); --指定keyc刪除
erase(elem);//刪除指定元素
clear() --清空容器
使用示例:
#include
#include
using namespace std;
class Person
{
public:
Person() {
}
Person(int age, string name) :age(age), name(name) {
}
int age;
string name;
};
ostream& operator<(ostream& cout, Person& p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age < endl;
return cout;
}
void PrintMap(const map& p)
{
for (map::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "t姓名:" < (ptr-?>second).name < "t年齡:" < (ptr-?>second).age < endl;
}
}
void test()
{
map p;
//第一種方式:
p.insert(pair(1, Person(18, "小王")));
//第二種方式:
p.insert(make_pair(5, Person(19, "小林")));
//第三種
p.insert(map::value_type(2, Person(20, "小崔")));
//第四種
p[3] = Person(20,"小劉");//一般不推薦這種方式
cout <"p[3]內容:"< p[3] < endl;//可以通過[]方式訪問
cout < "p的成員信息:" < endl;
PrintMap(p);
mapp2;
p2.insert(p.begin(), p.end());//區間插入
cout < "p2的成員信息:" < endl;
PrintMap(p2);
cout < "p2刪除第2個位置的內容:" < endl;
map::iterator pos = p2.begin();
for (int i = 0; i < 2; i++)pos++;
p2.erase(pos);
PrintMap(p2);
cout < "p2刪除指key值刪除(key=1)" < endl;
p2.erase(1);
PrintMap(p2);
cout < "p2刪除區間" < endl;
p2.erase(p2.begin(),p2.end());//相當于p.clear()
PrintMap(p2);
}
int main()
{
test();
system("pause");
}
5.map/multimap查找與統計
map/multimap查找:
find(key);//按key值查找
lower_bound(key);//找到第一個大于等于key值,返回該位置的迭代器
upper_bound(key);//返回第一個大于key的值的迭代器
equal_range(key);//返回一個迭代器隊組,第一個值等價于lower_bound(key)迭代器
第二個值等價于upper_bound(key)迭代器
map/multimap統計:
count(key);//按key值統計
使用示例:
#include
using namespace std;
#include
class Person
{
public:
Person() {}
Person(int age, string name) :age(age), name(name) {
}
string name;
int age;
};
ostream& operator<(ostream& cout, Person& p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age;
return cout;
}
void PrintMap(map& p)
{
for (map::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "t" < ptr-?>second < endl;
}
}
void test()
{
mapp;
p.insert(pair(1, Person(18, "小王")));
p.insert(make_pair(3, Person(25, "小劉")));
p.insert(map::value_type(2, Person(18, "小林")));
p.insert(make_pair(4, Person(20, "阿水")));
p.insert(make_pair(2, Person(20, "阿水")));
PrintMap(p);
map::iterator ret=p.find(2);
if (ret != p.end())
{
cout < "查找成功!" < endl;
cout < "key=" < ret-?>first < "t" < ret-?>second < endl;
}
else
{
cout < "未查找到!" < endl;
}
int cnt=p.count(2);
cout < "key=2的個數:" < cnt < endl;
}
void PrintmultiMap(multimap& p)
{
for (multimap::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "t" < ptr-?>second < endl;
}
}
//multimap示例
void test02()
{
multimapmp;
mp.insert(pair(1, Person(18, "小王")));
mp.insert(make_pair(2, Person(25, "小劉")));
mp.insert(multimap::value_type(2, Person(18, "小林")));
mp.insert(make_pair(4, Person(20, "阿水")));
mp.insert(make_pair(2, Person(20, "阿水")));
cout < "multimap成員信息" < endl;
PrintmultiMap(mp);
multimap::iterator temp = mp.find(2);
cout < "key=2的所有成員信息:" < endl;
for (int k = 0; k < mp.count(2); k++, temp++)
{
cout < "key=" < temp-?>first < "t" < temp-?>second < endl;
}
cout < "key=2的個數:" < mp.count(2) < endl;
cout < "key=2的所有成員信息:" < endl;
temp = mp.lower_bound(2);
multimap::iterator temp2 = mp.upper_bound(2);
for (; temp != temp2; temp++)
{
cout < "key=" < temp-?>first < "t" < temp-?>second < endl;
}
cout < "key=2的所有成員信息:" < endl;
pair::iterator, multimap::iterator> ret2 = mp.equal_range(2);
while (ret2.first != ret2.second)
{
cout < "key=" < (ret2.first)-?>first < "t" < (ret2.first)-?>second < endl;
ret2.first++;
}
}
int main()
{
cout < "map" < endl;
test();
cout < "nmultimap" < endl;
test02();
system("pause");
}
6.map/multimap指定排序
map/multimap插入數據時默認以key值排序,按照升序排序,若要改為降序排序,則需要提供一個仿函數。
#include
using namespace std;
#include
class Person
{
public:
Person() {
}
Person(int age, string name) :age(age), name(name) {
}
int age;
string name;
};
ostream& operator<(ostream& cout, const Person& p)
{
cout < "姓名:" < p.name < "t年齡:" < p.age ;
return cout;
}
class mycompare
{
public:
bool operator()(int val1, int val2)const
{
return val1 > val2;
}
};
void PrintMap(const map& p)
{
for (map::const_iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "key=" < ptr-?>first < "t" < ptr-?>second < endl;
}
}
void test01()
{
mapp;
p.insert(make_pair(1, Person(18, "小王")));
p.insert(make_pair(6, Person(25, "小劉")));
p.insert(make_pair(2, Person(18, "小林")));
p.insert(make_pair(4, Person(20, "阿水")));
p.insert(make_pair(3, Person(20, "阿水")));
PrintMap(p);
}
int main()
{
test01();
system("pause");
}
7.職工分組管理案例
公司有10個員工(ABCDEFGHIJ),現在用重新對員工進行部門調整;員工信息組成:姓名、工資,所屬部門(策劃、美工、研發);
1.隨機給10個員工分配部門和工資;
2.通過multimap隨機插入,key代表部門,value代表員工;
3.分部門顯示員工信息(職工信息以工資從高到底進行排序);
- 功能實現:
(1)創建職工類,該類包含的成員有職工姓名、工資;
(2)創建一個vector容器,保存10個職工信息。姓名和工資均通過隨機數生成;
(3)對vector容器進行排序,按工資進行降序排序;
(4)創建一個multimap容器,所屬部門作為key,進行職工信息插入;
(5)進行分部門輸出職工信息。通過lower_bound()和upper_bound()函數進行查找處理。
實現示例:
#include
#include
#include
#include
using namespace std;
class Worker
{
public:
Worker(string name, int money) :name(name), money(money) {
}
bool operator(Worker p)const
{
if (this-?>money == p.money)
{
return this->name < p.name;
}
return this-?>money>p.money;
}
string name;//姓名
int money;//工資
};
ostream& operator<(ostream& cout, Worker& p)
{
cout < "姓名:" < p.name < "t工資:" < p.money;
return cout;
}
//設置員工信息
void SetWorkerInfo(vector &p)
{
char data;
int money;
for (int i = 0; i < 10; i++)
{
data = 'A' + rand() % 11;
string name;
name = data;
money = 6000 + rand() % 10000;
p.push_back(Worker(name, money));
}
//對員工按工資排序
sort(p.begin(),p.end());
}
//分配部門信息
void SetWorkerPosition(multimap& p,vector&vtr)
{
int flag = 0;
for (int i = 0; i < 10; i++)
{
flag = rand() % 3;
switch (flag)
{
case 0://策劃
p.insert(make_pair("策劃", vtr[i]));
break;
case 1://美工
p.insert(make_pair("美工", vtr[i]));
break;
case 2://研發
p.insert(make_pair("研發", vtr[i]));
break;
}
}
}
//分部門顯示信息
void DisplayWorkerInfo(multimap&p, string position)
{
multimap::iterator begin = p.lower_bound(position);//找到第一個>=position內容
multimap::iterator end = p.upper_bound(position);//找找到第一個>positionn內容
cout < "t" < position < "部門員工 " < p.count(position) < " 人" < endl;
for (; begin != end; begin++)
{
cout < begin-?>second < endl;
}
}
int main()
{
srand(time(NULL));//生成隨機數種子
vector vtr;//創建一個vec容器
//保存員工信息
SetWorkerInfo(vtr);
/*for (vector::iterator ptr = vtr.begin(); ptr != vtr.end(); ptr++)
{
cout < *ptr < endl;
}*/
multimapp;
SetWorkerPosition(p, vtr);
/*for (multimap::iterator ptr = p.begin(); ptr != p.end(); ptr++)
{
cout < "崗位:" < ptr-?>first < "t" < ptr-?>second < endl;
}*/
DisplayWorkerInfo(p, "策劃");
DisplayWorkerInfo(p, "美工");
DisplayWorkerInfo(p, "研發");
system("pause");
}
審核編輯:湯梓紅
-
函數
+關注
關注
3文章
4329瀏覽量
62576 -
容器
+關注
關注
0文章
495瀏覽量
22060 -
C++
+關注
關注
22文章
2108瀏覽量
73627 -
MAP
+關注
關注
0文章
49瀏覽量
15137
發布評論請先 登錄
相關推薦
評論