当前位置: 首页 > news >正文

关联容器-模板类pair数对

关联容器

关联容器和顺序容器有着根本的不同:关联容器中的元素是按关键字来保存和访问的,而顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。

关联容器支持高效的关键字查找和访问。

两个主要的关联容器(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; //成员1
    T2 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拷贝构造一个p3
    p3.first = 100;
    cout << "p3=(" << p3.first << "," << p3.second << ")" << endl;

    p1 = p3;//把p3赋值给p1
    cout << "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的键和值分别对应pairfirstsecond

#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++ 的编程世界中更加游刃有余地前行。

相关文章:

  • [oeasy]082_list_列表类_空列表
  • 【大模型】DeepSeek + 蓝耕MaaS平台 + 海螺AI生成高质量视频操作详解
  • 算法竞赛备赛——【图论】链式前向星
  • 回表, 覆盖索引,索引下推简述
  • 混凝土强度预测工程实践
  • ASRank: Zero-Shot Re-Ranking with Answer Scent for DocumentRetrieval
  • 蓝桥杯_LITS游戏 俄罗斯方块 模拟 暴力 搜索 DFS 剪纸 枚举
  • TRPO和PPO算法详解
  • C++单例模式
  • 让ChatGPT用DeepReaserch指导进行学术写作
  • vue猜词游戏
  • 进程内存分布--之理论知识
  • 中钧科技通过数字赋能,编织“数字互联网”助力数字化进程!
  • SSM整合实战
  • 手搓多模态-03 顶层和嵌入层的搭建
  • 玄机-应急响应-入侵排查
  • 图解AUTOSAR_SWS_FlexRayARTransportLayer
  • 性能问题排查工具介绍
  • 移动应用开发实验室2024二面纳新题复盘
  • 【家政平台开发(20)】系统监控与日志管理设计:稳固运行的基石
  • 重庆中国建设监理协会网站/网站域名查询系统
  • 美食网站建设/整合营销包括哪些内容
  • 百度制作企业网站多少钱/世界十大网站排名
  • dw做的静态网站怎么分享链接/百度通用网址
  • 怎样做电影网站/对seo的认识和理解
  • 青岛网站建设设计/最近的新闻大事10条