- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章C++中最常用的容器用法与排序实例由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
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 其实也够了。配上结构体,什么都能干,操作麻烦一点性能差一点而已了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
#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 来说是致命的耗时,所以我们一般不这么干,不这么干,那就没写这个了.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
#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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#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.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
#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++容器用法与排序内容请搜索我以前的文章或继续浏览下面的相关文章希望大家以后多多支持我! 。
原文链接:https://blog.csdn.net/lusongno1/article/details/119988659 。
最后此篇关于C++中最常用的容器用法与排序实例的文章就讲到这里了,如果你想了解更多关于C++中最常用的容器用法与排序实例的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试对每个条目有多个值的关联数组进行排序。 例如 [0] => stdClass Object ( [type] => node [sid] => 158 [score] => 0.059600
我在 mysql 中有“日期”列以这种格式保存日期 2014 年 9 月 17 日(日-月-年) 我需要对它们进行升序排序,所以我使用了这个命令: SELECT * FROM table ORDER
我目前正在将 MySQL 存储过程重写为 MS SQL 存储过程,但遇到了问题。 在 MySQL 存储过程中,有一个游标,它根据最近的日期 (effdate) 选择一个值并将其放入变量 (thestt
我想要 gwt r.QuestionId- 排序。但是我得到未排序的 QuestionId 尽管我提到了 QuestionId ASC 的顺序。 SELECT r.QuestionId,
我有一个关于在 scandir 函数中排序的基本问题。到目前为止,我阅读了 POSIX readdir 的手册页,但没有找到有关订购保证的具体信息。 但是当我遍历大目录(无法更改,只读)时,我在多个系
基本上我必须从 SQL 数据库中构建项目列表,但是用户可以选择对 7 个过滤器的任意组合进行过滤,也可以选择要排序的列以及按方向排序。 正如您可以想象的那样,这会以大量不同的组合进行编码,并且数据集非
我有两张 table 。想象第一个是一个目录,包含很多文件(第二个表)。 第二个表(文件)包含修改日期。 现在,我想选择所有目录并按修改日期 ASC 对它们进行排序(因此,最新的修改最上面)。我不想显
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
在 C++ 中,我必须实现一个“类似 Excel/Access”(引用)的查询生成器,以允许对数据集进行自定义排序。如果您在 Excel 中使用查询构建器或 SQL 中的“ORDER BY a, b,
我面临这样的挑战: 检索按字段 A 排序的文档 如果字段 B 存在/不为空 . 否则 按字段排序 C. 在 SQL 世界中,我会做两个查询并创建一个 UNION SELECT,但我不知道如何从 Mon
我想对源列表执行以下操作: map 列表 排序 折叠 排序 展开 列表 其中一些方法(例如map和toList)是可链接的,因为它们返回非空对象。但是,sort 方法返回 void,因为它对 List
我制作了一个用于分析 Windows 日志消息编号的脚本。 uniq -c 数字的输出很难预测,因为根据数字的大小会有不同的空白。此时,我手动删除了空白。 这是对消息进行排序和计数的命令: cat n
我有以下词典: mydict1 = {1: 11, 2: 4, 5: 1, 6: 1} mydict2 = {1: 1, 5: 1} 对于它们中的每一个,我想首先按值(降序)排序,然后按键(升序)排序
我刚刚开始使用泛型,目前在对多个字段进行排序时遇到问题。 案例: 我有一个 PeopleList 作为 TObjectList我希望能够通过一次选择一个排序字段,但尽可能保留以前的排序来制作类似 Ex
有没有办法在 sql 中组合 ORDER BY 和 IS NULL 以便我可以在列不为空时按列排序,但如果它为null,按另一列排序? 最佳答案 类似于: ORDER BY CASE WHEN
我有一个包含 2 列“id”和“name”的表。 id 是常规的自动增量索引,name 只是 varchar。 id name 1 john 2 mary 3 pop 4 mary 5 j
场景 网站页面有一个带有分页、过滤、排序功能的表格 View 。 表中的数据是从REST API服务器获取的,数据包含数百万条记录。 数据库 REST API 服务器 Web 服务器 浏览器 问
假设我有一本字典,其中的键(单词)和值(分数)如下: GOD 8 DONG 16 DOG 8 XI 21 我想创建一个字典键(单词)的 NSArray,首先按分数排序,然后按字
如何在 sphinx 上通过 sql 命令选择前 20 行按标题 WEIGHT 排序,接下来 20 行按标题 ASC 排序(总共 40 个结果),但不要给出重复的标题输出。 我尝试了这个 sql 命令
我有一个奇怪的问题,当从 SQLite 数据库中选择信息并根据日期排序时,返回的结果无效。 我的SQL语句是这样的: Select pk from usersDates order by dateti
我是一名优秀的程序员,十分优秀!