广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++中最常用的容器用法与排序实例
  • 902
分享到

C++中最常用的容器用法与排序实例

2024-04-02 19:04:59 902人浏览 泡泡鱼
摘要

目录引述vector用法其他说明map用法其他说明set用法其他说明string用法总结引述 c++ 的 STL 容器分为顺序容器和关联容器。 顺序容器:vector、deque、

引述

c++ 的 STL 容器分为顺序容器和关联容器。

顺序容器:vector、deque、list(forward_list)、array、string

关联容器:map 和 set(及其 multi 和 无序版本)

容器适配器(不是容器):stack、queue、priority_queue

所谓的顺序容器宏观上理解就是小鬼们按一定的顺序排排坐。关联式包括类似于数据库里面,有一个 key,有一个值这样的。只有顺序容器的构造函数才接受大小参数,关联容器并不支持。

顺序容器的 at 和下标操作值适用于 vector、string、deque、array。

容器那么多,操作那么杂,比如 array 不支持添加操作,forward_list 不支持 push_back,vector 和 string 不支持 push_front 等等,我也不住所有。既然如此,我们其实只要记一些关键容器的关键用法即可,其他等到需要的时候,百度查一查即可。下面,就是列出一些我们用得最多的容器的最最常用的一些操作和方法。

不考虑性能以及特殊数据结构专有特性,一般 vector+map+set+string 可以打天下了。记那么多干嘛,年纪大了,根本记不住。如果非要留一个,vector 其实也够了。配上结构体,什么都能干,操作麻烦一点性能差一点而已了。

vector

用法


#include<iOStream>
#include<vector>
#include <alGorithm>
using namespace std;
int main() {
	vector<int> vec;
	vec.push_back(1);
	vector<int> vec1;
	vec1.resize(10);//10 个 0
	vector<int> vec2(10);//10个元素,每个元素都是 0
	vector<int> vec3(10, 1);//10 个 1
	vec3.assign(10, 1);//分配 10 个 1
	vector<int> vec4(vec3);
	vec.size();
	vec.empty();
	vec.front();//返回一个元素,即迭代器start指向的元素
	vec.back();
	vector<int>::iterator it;
	it = vec1.begin() + 5;
	vec1.erase(it);//清除某个位置的元素
	vec.clear();//清除所有的元素
	it = find(vec3.begin(), vec3.end(), 10);//查找
	sort(vec3.begin(), vec3.end());//vector没有自带排序方法,调用算法包,升序排序(默认)
	sort(vec3.begin(), vec3.end(), less<int>());//升序排序
	sort(vec3.begin(), vec3.end(), greater<int>());//降序排序
	for (auto& it : vec) it++;//C++11 方式引用变量

	vec3.capacity();获取包括备用空间在内的总容量大小
	vec3.at(5);作用同上,增加异常处理,越界抛出out of range
	vec3.max_size();//最大容量,即最多可以存储多少个当前类型元素
	vec3.pop_back();//清除位于最后一个的元素
	vec3.erase(vec3.begin(), vec3.end());
	vec3.swap(vec2);
	reverse(vec.begin(), vec.end());//元素翻转
	for (int i = 0; i < vec.size(); i++) cout << vec[i] << endl;
	for (it = vec.begin(); it != vec.end(); it++) cout << *it << endl;
	for (auto it : vec) cout << it << endl;
	vector<int>::reverse_iterator rit;
	for (rit = vec.rbegin(); rit != vec.rend(); rit++) cout << *rit << endl;
	
	return 0;
}

其他说明

通常,使用 vecotr 是最好的选择,除非你有很好的理由选择其他容器。这也是我几乎不介绍其他顺序容器的原因。什么时候不用 vector 呢?比如说,当你基于性能的考虑,或者基于数据结构典型用法的考虑。这里说的数据结构典型性,指的是譬如你要写的一个算法,用到了非常典型 “先进后出” 的特征,而且有高强度的弹出和推入的操作,这时候你不妨考虑用 stack,而不是 vector。

在 vector 中间插入是合法但是是耗时的。很多人写算法,想到哪个就用哪个,这是很不对的,在选择容器的时候,我们要考虑程序的性能。那么应该如何选择合适的容器呢?如果你想表达的数据,stack 或者 queue 的特征已经非常明显了,直接用他俩;如果对数据后续要有大量的查找,就用关联式容器,其中又以无序的查找最快,但是它无序;如果有大量的添加和删除操作(特别是在中间),选择 list,而尽可能地避免 vector 和 array;如果对元素的次序要求比较高,且没有元素在中间的插入或者删除,且没有极其大量的查找,可以选择 vector 和 array…

vector 其实也支持 insert 操作,但是因为中间的插入对于 vector 来说是致命的耗时,所以我们一般不这么干,不这么干,那就没写这个了。

map

用法


#include<iostream>
#include<map>
using namespace std;
int main() {
	map<int, string> st;
	st[0] = "str1";
	st[1] = "str3";
	st[2] = "str2";
	st.insert(make_pair(3, "str3"));
	st.insert(pair<int,string>(4, "str4"));
	for (auto& it : st) cout << it.second << endl;
	for (int i = 0; i < st.size(); i++) {//直接访问
		cout << st[i] << endl;
	}
	map<int, string>::iterator it = st.begin();//通过迭代器访问
	for (it;it != st.end(); it++) {
		cout << it->first << " " << it->second << endl;
	}
	it = st.find(0);
	cout << it->first << " " << it->second << endl;

	st.erase(1);//通过键删除
	st.erase(st.find(0));//通过迭代器(指针)删除
	st.erase(st.begin(), st.end());//相当于st.clear()

	return 0;

}

其他说明

对一个 map 使用下标操作,其行为与数组或者 vector 上的下标操作很不相同:使用一个不在容器中的关键字作为下标,会添加一个具有此关键字的元素到 map 中。

map 是插入元素的时候就已经排好序了,当你需要排好序的数据结构的时候,可以考虑 map 和 set。

set

用法


#include<iostream>
#include<set>
using namespace std;
int main() {
	set<int> s;
	s.insert(3);
	s.insert(5);
	s.insert(1);
	for (auto& it : s) cout << it << endl;
	set<int>::iterator it; 
	for (it = s.begin();it != s.end(); it++) {
		cout << *it<< endl;
	}

	s.erase(s.find(1));
	s.erase(3);
	s.erase(s.find(5), s.end());//删除了5,9 
	s.clear();
	cout << s.size();//输出为
	return 0;

} 

其他说明

与 map 不同的地方,不能通过下标 key 来访问了,只能直接 find。

string


#include<cstdio>
#include<string>
using namespace std;
int main() {
	//增
	string str1 = "abc";
	string str2 = "def";
	string str = str1 + str2;
	str > str2;//字典序比较
	str.insert(2, str1);	//在下标为 2 的地方插入str1
	str.insert(str.begin() + 1, str1.begin(), str1.end());

	//删
	str.erase(str.begin() + 1);
	str.erase(str.begin() + 2, str.end());
	str.erase(1, 2);//删除从 1 开始的 2 个元素

	//改
	str.replace(0, 2, str1);//把起始位置为 0,长度为 2 的源子串替换为str1
	str.replace(str.begin(), str.begin() + 2, str1);

	//查(包括访问)
	int pos = str.find("bc");//返回查找字符串第一次在源串中的位置
	pos = str.find("bc", 2);//从源串的第 2 个位开始查找, 返回在 str 中的下标
	for (auto& it : str) printf("%c\n", it);//
	for (auto it = str.begin(); it < str.end(); it++) {
		printf("%c\n", *it);
	}

	return 0;
}

用法

其他说明

string 和 vector 一样,支持数字下标访问。

直接读入或者输出一个 string 类型,用 cin 和 cout。str[i] 要用 printf 输出的。

总结

到此这篇关于C++中最常用的容器用法与排序的文章就介绍到这了,更多相关C++容器用法与排序内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++中最常用的容器用法与排序实例

本文链接: https://www.lsjlt.com/news/134111.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • C++中最常用的容器用法与排序实例
    目录引述vector用法其他说明map用法其他说明set用法其他说明string用法总结引述 C++ 的 STL 容器分为顺序容器和关联容器。 顺序容器:vector、deque、...
    99+
    2022-11-12
  • C++使用sort对容器排序的实现
    本文主要解决以下问题 STL中sort的使用方法 使用sort对vector的排序 使用sort对map排序 使用sort对list排序 ...
    99+
    2022-11-12
  • c语言实现的几种常用排序算法
    概述 最近重新回顾了一下数据结构和算法的一些基本知识,对几种排序算法有了更多的理解,也趁此机会通过博客做一个总结。 1.选择排序-简单选择排序 选择排序是最简单的一种基于O(n2)时...
    99+
    2022-11-12
  • Java常用的八种排序算法与代码实现
    目录1.直接插入排序2.希尔排序3.简单选择排序4.堆排序5.冒泡排序6.快速排序7.归并排序8.基数排序1.直接插入排序 经常碰到这样一类排序问题:把新的数据插入到已经排好的数据列...
    99+
    2022-11-12
  • Python实现的堆排序算法原理与用法实例分析
    本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下: 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的...
    99+
    2022-06-04
    算法 实例 原理
  • GO语言中常见的排序算法使用示例
    目录快排冒泡选择排序插入排序希尔排序二分法查找快排 package main import ( "fmt" "math/rand" "time" ) func main() {...
    99+
    2022-11-13
  • Go语言实现常用排序算法的示例代码
    目录冒泡排序快速排序选择排序插入排序排序算法是在生活中随处可见,也是算法基础,因为其实现代码较短,应用较常见。所以在面试中经常会问到排序算法及其相关的问题,可以说是每个程序员都必须得...
    99+
    2022-11-11
  • Python实现的选择排序算法原理与用法实例分析
    本文实例讲述了Python实现的选择排序算法。分享给大家供大家参考,具体如下: 选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的...
    99+
    2022-06-04
    算法 实例 原理
  • Python实现的插入排序算法原理与用法实例分析
    本文实例讲述了Python实现的插入排序算法原理与用法。分享给大家供大家参考,具体如下: 插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据,算法适用于少量数...
    99+
    2022-06-04
    算法 实例 原理
  • Python实现的基数排序算法原理与用法实例分析
    本文实例讲述了Python实现的基数排序算法。分享给大家供大家参考,具体如下: 基数排序(radix sort)属于“分配式排序”(distribution sort),又称“桶子法”(bucket sor...
    99+
    2022-06-04
    基数 算法 实例
  • Python实现希尔排序算法的原理与用法实例分析
    本文实例讲述了Python实现希尔排序算法的原理与用法。分享给大家供大家参考,具体如下: 希尔排序(Shell Sort)是插入排序的一种。也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。 希尔...
    99+
    2022-06-04
    希尔 算法 实例
  • Java中常见的查找算法与排序算法怎么使用
    这篇文章主要介绍了Java中常见的查找算法与排序算法怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java中常见的查找算法与排序算法怎么使用文章都会有所收获,下面我们一起来看看吧。1. 基本查找也叫做顺...
    99+
    2023-07-05
  • python常用的各种排序算法原理与实现方法小结
    1. 冒泡排序(Bubble Sort) 基本思想:重复地遍历待排序的数列,每次比较相邻的两个元素,如果它们的顺序错误就交换位置,直到没有需要交换的元素为止。 实现代码: def b...
    99+
    2023-05-17
    python 排序算法
  • C++中string类的常用方法实例总结
    目录引言C++string类常用方法总结引言 C++中提供了一种新的数据类型——字符串类型(string)。实际上string并不是C++的基本类型,它是在C...
    99+
    2022-11-13
  • C++11中std::function与std::bind的用法实例
    目录关于std::function 的用法:关于std::bind 的用法:附:std::function与std::bind双剑合璧总结关于std::function 的用法: 其...
    99+
    2022-11-13
  • Spring-IOC容器中的常用注解与使用方法详解
    Spring是什么? Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。它是一个分层的Java...
    99+
    2022-11-12
  • C语言中qsort函数的介绍与用法实例
    目录一.qsort函数是什么 二.使用qsort排序-以升序为例1.整形数组排序2.字符数组排序3.字符指针数组排序4.结构体数组排序5.浮点型数组排序三.使用冒泡排序思想...
    99+
    2022-11-12
  • Python中使用插入排序算法的简单分析与代码示例
    问题描述 将一组随机排列的数字重新按照从小到大的顺序排列。 插入算法 每次从数组中取一个数字,与现有数字比较并插入适当位置。 如此重复,每次均可以保持现有数字按照顺序排列,直到数字取完,即排序成功。 这很像...
    99+
    2022-06-04
    示例 算法 代码
  • JavaScript 应用程序在容器中的部署最佳实践。
    JavaScript 应用程序在容器中的部署最佳实践 JavaScript 是一种常用的编程语言,它在网页开发和应用程序开发中都扮演着重要的角色。随着云计算和容器技术的发展,越来越多的 JavaScript 应用程序开始被部署在容器中。本文...
    99+
    2023-09-04
    容器 javascript linux
  • Java开发中容器概念、分类与用法的示例分析
    这篇文章将为大家详细讲解有关Java开发中容器概念、分类与用法的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1、容器的概念在Java当中,如果有一个类专门用来存放其它类的对象,这个类就叫做容器,...
    99+
    2023-05-30
    java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作