文章目錄
- set/multiset容器
- set基本概念
- 簡介
- 區別
- set的構造和賦值
- 功能描述
- 函數原型
- 代碼示例
- 運行結果
- set的大小和交換
- 功能描述
- 函數原型
- 代碼示例
- 運行結果
- set的插入和刪除
- 功能描述
- 函數原型
- 代碼示例
- 運行結果
- set查找和統計
- 函數原型
- 代碼示例
- 運行結果
- set和multiset區別
- 區別
- 代碼示例
- 運行結果
- pair隊組創建
- 功能描述
- 創建方式
- 代碼示例
- 運行結果
- set容器排序
- 代碼示例
- map容器
- map基本概念
- 簡介
- 本質
- 優點
- map和multimap區別
- map的構造和賦值
- 函數原型
- 代碼示例
- map大小和交換
- 代碼示例
- map插入和刪除
- 函數原型
- 代碼示例
- map查找和統計
- 函數原型
- 代碼示例
- map容器排序
- 主要技術點
- 代碼示例
set/multiset容器
set基本概念
簡介
-
所有元素都會在插入時被自動排序
-
set/multiset屬于關聯式容器,底層結構是用二叉樹實現
區別
-
set不允許容器中有重復的元素
-
multiset允許容器中有重復的元素
set的構造和賦值
功能描述
- 創建set容器及賦值
函數原型
代碼示例
#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默認構造set<int> s1;s1.insert(1);s1.insert(3);s1.insert(4);printSet(s1);// 拷貝構造set<int> s2(s1);printSet(s2);// 重載等號操作符set<int> s3 = s1;printSet(s3);
}int main() {test();return 0;
}
運行結果
set的大小和交換
功能描述
- 統計set大小及交換set容器
函數原型
代碼示例
#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默認構造set<int> s1;s1.insert(1);s1.insert(3);s1.insert(2);s1.insert(4);printSet(s1);cout << "set容器的大小:" << s1.size() << endl;cout << "set容器是否為空:" << s1.empty() << endl;set<int> s2;s2.insert(7);s2.insert(5);cout << "交換前:" << endl;printSet(s1);printSet(s2);s1.swap(s2);cout << "交換后:" << endl;printSet(s1);printSet(s2);
}int main() {test();return 0;
}
運行結果
set的插入和刪除
功能描述
- set容器進行插入和刪除數據
函數原型
代碼示例
#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默認構造set<int> s1;for (int i = 0; i < 10; i++) {// 使用insert向容器中插入元素s1.insert(i);}printSet(s1);cout << "erase刪除指定位置的元素:";s1.erase(s1.begin());cout << "erase刪除給定元素:";s1.erase(3);printSet(s1);cout << "erase 清空";s1.erase(s1.begin(), s1.end());printSet(s1);cout << "clear 清空";s1.clear();
}int main() {test();return 0;
}
運行結果
set查找和統計
函數原型
代碼示例
#include <iostream>
#include <set>using namespace std;void printSet(const set<int> &s) {for (set<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test() {// 默認構造set<int> s1;for (int i = 0; i < 10; i++) {// 使用insert向容器中插入元素s1.insert(i);}printSet(s1);set<int>::iterator pos = s1.find(5);if (pos != s1.end()) {cout << "找到了" << endl;} else {cout << "沒找到" << endl;}cout << "統計給定值的出現次數:";int count = s1.count(2);// 對于set而言,統計的結果要么是1要么是0cout << count << endl;
}int main() {test();return 0;
}
運行結果
set和multiset區別
區別
-
set不可以插入重復數據,而multiset可以
-
set插入數據的同時會返回插入結果,表示插入是否成功
-
multiset不會檢測數據,因此可以插入重復數據
代碼示例
#include <iostream>
#include <set>using namespace std;void printSet(const multiset<int> &s) {for (multiset<int>::const_iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}cout << endl;
}void test1() {set<int> s;pair<set<int>::iterator, bool> ret = s.insert(1);if (ret.second) {cout << "第一次插入成功" << endl;} else {cout << "第一次插入失敗" << endl;}ret = s.insert(1);if (ret.second) {cout << "第二次插入成功" << endl;} else {cout << "第二次插入失敗" << endl;}
}void test2() {// 默認構造multiset<int> s1;s1.insert(1);s1.insert(1);s1.insert(2);s1.insert(4);s1.insert(4);s1.insert(4);printSet(s1);int count = s1.count(4);cout << "4的數量:" << count << endl;
}int main() {test1();test2();return 0;
}
運行結果
pair隊組創建
功能描述
- 成對出現數據,利用隊組可以返回兩個數據
創建方式
代碼示例
#include <iostream>using namespace std;void test() {pair<int, int> p1(1, 1);cout << p1.first << " " << p1.second << endl;pair <string, string> p2 = make_pair("Tom", "cat");cout << p2.first << " " << p2.second << endl;}int main() {test();return 0;
}
運行結果
set容器排序
-
set默認插入的時候是從小到大排序的
-
利用仿函數可以實現,從大到小排序
代碼示例
#include <iostream>
#include <set>using namespace std;class Person {
public:Person(string name, int age) {this->name = name;this->age = age;}// 對于自定義的數據類型需要指定排序規則
// bool operator<(const Person &p) const {
// if (name < p.name) {
// return true;
// } else if (name > p.name) {
// return false;
// } else {
// return age < p.age;
// }
// }
//string name;int age;
};class comparePerson{
public:bool operator()(const Person &p1, const Person &p2) {return p1.age > p2.age;}
};void printPersonSet(const set <Person> &s) {for (set<Person>::const_iterator it = s.begin(); it != s.end(); it++) {cout << "name:" << (*it).name << " age: " << (*it).age << endl;}
}void test() {Person p1("sad1", 1);Person p2("sad2", 2);Person p3("sad3", 3);Person p4("sad4", 4);Person p5("sad5", 5);Person p6("sad6", 6);Person p7("sad6", 5);set <Person, comparePerson> s1;s1.insert(p1);s1.insert(p2);s1.insert(p3);s1.insert(p4);s1.insert(p5);s1.insert(p6);s1.insert(p7);for (set<Person>::const_iterator it = s1.begin(); it != s1.end(); it++) {cout << "name:" << (*it).name << " age: " << (*it).age << endl;}
}int main() {test();return 0;
}
map容器
map基本概念
簡介
-
map中所有元素都是pair
-
pair中第一個元素為key (鍵值),起到索引作用,第二個元素為value (實值)
-
所有元素都會根據元素的鍵值自動排序
本質
- map/multimap屬于關聯式容器,底層結構是用二叉樹實現
優點
- 可以根據key值快速找到value值
map和multimap區別
-
map中不允許有重復的key值元素
-
multimap中不允許有重復的key值元素
map的構造和賦值
函數原型
代碼示例
#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "默認構造函數:";map<int, int> mp;for (int i = 0; i < 5; i++) {mp[i] = i;}printMap(mp);cout << "拷貝構造函數:";map<int, int> mp1(mp);printMap(mp1);cout << "重載等號操作符:";map<int, int> mp2 = mp;printMap(mp2);
}int main() {test();return 0;
}
map大小和交換
代碼示例
#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "默認構造函數:";map<int, int> mp;for (int i = 0; i < 5; i++) {mp[i] = i;}printMap(mp);cout << "mp大小: " << mp.size() << endl;if (mp.empty()) {cout << "mp為空" << endl;} else {cout << "mp不為空" << endl;}map<int, int> mp1;for (int i = 5; i > 0; i--) {mp1[i] = i;}printMap(mp1);cout << "交換后" << endl;mp1.swap(mp);printMap(mp);printMap(mp1);
}int main() {test();return 0;
}
map插入和刪除
函數原型
代碼示例
#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "mp insert: ";map<int, int> mp;pair<int, int> p1(4, 6);pair<int, int> p2(2, 1);pair<int, int> p3(5, 3);pair<int, int> p4(1, 6);mp.insert(p1);mp.insert(p2);mp.insert(p3);mp.insert(p4);printMap(mp);cout << "mp刪除指定key: ";mp.erase(2);printMap(mp);cout << "mp刪除指定pos: ";mp.erase(mp.begin());printMap(mp);cout << "mp刪除指區間所有元素: ";mp.erase(mp.begin(), mp.end());printMap(mp);cout << "清空mp";mp.clear();printMap(mp);
}int main() {test();return 0;
}
map查找和統計
函數原型
代碼示例
#include <iostream>
#include <map>using namespace std;void printMap(map<int, int> mp) {for (map<int, int>::iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}void test() {cout << "mp insert: ";map<int, int> mp;pair<int, int> p1(4, 6);pair<int, int> p2(2, 1);pair<int, int> p3(5, 3);pair<int, int> p4(1, 6);mp.insert(p1);mp.insert(p2);mp.insert(p3);mp.insert(p4);printMap(mp);map<int, int>::iterator pos = mp.find(3);if (pos != mp.end()) {cout << "3 find" << endl;} else {cout << "3 not find" << endl;}cout << "查找給定值出現的次數:" << mp.count(1) << endl;
}int main() {test();return 0;
}
map容器排序
主要技術點
- 利用仿函數,可以改變函數規則
代碼示例
#include <iostream>
#include <map>using namespace std;class DescCompare {
public:// error: no matching function for call to object of type 'const DescCompare',所以需要使用const修飾bool operator()(int a, int b) const {return a > b;}
};void test() {cout << "mp insert: ";map<int, int, DescCompare> mp;pair<int, int> p1(4, 6);pair<int, int> p2(2, 1);pair<int, int> p3(5, 3);pair<int, int> p4(1, 6);mp.insert(p1);mp.insert(p2);mp.insert(p3);mp.insert(p4);for (map<int, int, DescCompare>::const_iterator it = mp.begin(); it != mp.end(); it++) {cout << (*it).first << " " << (*it).second << "\t";}cout << endl;
}int main() {test();return 0;
}