关联容器
关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。
关联容器支持高效的关键字查找和访问。
两个主要的关联容器(associative-container),set和map。
set 中每个元素只包含一个关键字。set 支持高效的关键字查询操作一一检查一个给定关键字是否在 set 中。
map 的元素是关键字-值 (key-value)对(也称键-值对)。其中关键字起到索引的作用,值则表示与索引相关联的数据。字典是一个很好的使用 map 的例子:可以将单词作为关键字,将单词释义作为值。
标准库针对set和map一共提供8种不同的关联容器。1.是否运行关键字重复;2.是否按顺序保存元素
set和multiset定义在头文件set中;map和multimap定义在头文件map中;无序容器则定义在头文件unordered set和unordered map中。
pair 数对是什么
pair数对是 C++ 标准库中的一个模板类,它提供了一种简单的方式来将两个值组合成一个单元。这两个值可以是相同类型,也可以是不同类型。就好比一个小巧的容器,专门用来存放两个紧密相关的数据元素。例如,在处理平面直角坐标系中的点时,我们可以用一个pair来同时存储点的横坐标和纵坐标;在统计单词出现频率时,pair能将单词及其对应的出现次数放在一起。
使用时需要引用文件
#include <utility>//通用工具
namespace std {template <typename T1,typename T2>struct pair {T1 first; //成员1T2 second;//成员2...};
}
操作函数
pair应用举例
pair的基本操作举例:
#include <iostream>
#include <utility>
using namespace std;int main()
{pair<int, double>p1;//创建一个空的pair//注意访问first和second时没有()cout << "p1=(" << p1.first << "," << p1.second << ")" << endl;pair<int, double>p2(10, 23.4);//创建一个pair,数据为(10,23.4)cout << "p2=(" << p2.first << "," << p2.second << ")" << endl;pair<int, double>p3(p2);//通过p2拷贝构造一个p3p3.first = 100;cout << "p3=(" << p3.first << "," << p3.second << ")" << endl;p1 = p3;//把p3赋值给p1cout << "p1 = p3后" << endl;cout << "p1=(" << p1.first << "," << p1.second << ")" << endl;p3 = make_pair(100, 200);cout << "p3 = make_pair(100,200)后" << endl;//通过get访问p3的成员cout << "p3=(" << get<0>(p3) << "," << get<1>(p3) << ")" << endl;return 0;
}
作为函数参数
pair
数对可以作为函数参数,使得函数能够方便地接收一组相关的数据。
#include <iostream>
#include <cmath>
#include <utility>
using namespace std;double distance(pair<double, double> point1, pair<double, double> point2) {double dx = point2.first - point1.first;double dy = point2.second - point1.second;return sqrt(dx * dx + dy * dy);
}int main() {pair<double, double> p1(1.0, 2.0);pair<double, double> p2(4.0, 6.0);cout << "Distance between points: " << distance(p1, p2) << endl;return 0;
}
作为函数返回值
函数也可以返回pair
数对,这样就能一次性返回两个相关的结果。
#include <iostream>
#include <utility>
using namespace std;
pair<int, int> MinMax(int* arr, int len)//找到数组的最小值和最大值
{int min = arr[0]; //最小值int max = arr[0];//最大值for (int i = 1; i < len; i++){if (arr[i] < min)min = arr[i];if (arr[i] > max)max = arr[i];}return make_pair(min, max);
}int main()
{int arr[] = { 3,1,8,9,34,2,67,5,70,12,34,65,99,20 };auto p = MinMax(arr, sizeof(arr) / sizeof(arr[0]));cout << "最小值:" << p.first << ",最大值:" << p.second << endl;return 0;
}
pair 数对与 STL 容器的结合
pair 在 vector 中的应用
pair 在 vector 中的应用 vector是 C++ 中常用的动态数组容器,当需要存储一组相关的数对时,vector与pair的结合非常实用。例如,统计单词出现次数的场景:
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <utility>
using namespace std;vector<pair<string, int>> countWords(const vector<string>& words) {vector<pair<string, int>> wordCount;for (const string& word : words) {auto it = find_if(wordCount.begin(), wordCount.end(),[&word](const pair<string, int>& p) {return p.first == word;});if (it != wordCount.end()) {++(it->second);}else {wordCount.emplace_back(word, 1);}}return wordCount;
}int main() {vector<string> sentence = { "apple", "banana", "apple", "cherry", "banana", "apple" };vector<pair<string, int>> result = countWords(sentence);for (const auto& pair : result) {cout << pair.first << ": " << pair.second << " 次" << endl;}return 0;
}
pair 在 map 中的应用
map
是一种关联容器,它以键值对的形式存储数据。实际上,map
的内部实现就是基于pair
的。map
的键和值分别对应pair
的first
和second
。
#include <iostream>
#include <map>
#include <string>using namespace std;int main() {map<string, int> ageMap;ageMap["Alice"] = 25;ageMap["Bob"] = 30;for (const auto& pair : ageMap) {cout << pair.first << " " << pair.second << "岁" << endl;}return 0;
}
这里ageMap
中的每一个元素本质上就是一个pair<string, int>
。
pair 数对的优势与使用场景
代码简洁性
使用pair
数对可以避免创建复杂的自定义结构体来存储两个相关的数据。例如,在简单的坐标表示或键值对存储场景中,pair
能极大地简化代码结构,使代码更加易读。
数据关联性
pair
明确地表达了两个数据元素之间的关联关系。在函数参数传递和返回值中,使用pair
能清晰地表明这两个值是作为一个整体进行处理的,增强了代码的语义性。
算法支持
C++ 标准库中的许多算法,如排序、查找等,都对pair
提供了良好的支持。这使得在处理包含pair
的容器时,能够方便地利用这些算法进行高效操作。
总结
pair
数对作为 C++ 标准库中的一个小巧而强大的工具,为我们在编程过程中处理相关数据提供了便捷的方式。从基本的定义、初始化和访问,到在函数参数、返回值以及与 STL 容器的结合应用,pair
数对都展现出了其独特的优势。它不仅能让代码更加简洁明了,还能提升代码的可读性和可维护性。在日常编程中,当你遇到需要处理两个相关数据的场景时,不妨尝试使用pair
数对,相信它会为你的编程工作带来意想不到的便利。让我们充分利用pair
数对这一强大武器,在 C++ 的编程世界中更加游刃有余地前行。