c++ container容器(string,vector,map,queue,stack等等)
STL和c++标准库
标准模板库STL部分包含在C++标准库中的软件库。
c++标准库:即以std::开头,但是部分编译器厂商也会把STL的内容放在std:: namespace里面
由于一个常见的误解,您可能会将C++标准库视为“STL”,或者将工具链中C++标准库的实现部分视为“STL实现”。
事实并非如此。
MSVC ++和GCC(作为编译器特定的扩展实现)都将其放在std命名空间中也是非常可惜的,这不仅具有高度误导性,而且根据标准也是非法的。
为什么c++的名词会这么混乱?
因为c++委员会制定标准,各家编译器厂商实现标准(gcc,msvc)
vector
类似于C#中的List,长度会自动扩容(2倍扩容),普通的数组需要初始化长度。
vector容器是支持随机访问的,即可以像数组一样用[]来取值。但不是所有的STL容器都有这个特性!
| 用法 | 作用 |
|---|---|
| vec.begin(),vec.end() | 返回vector的首、尾迭代器 |
| vec.front(),vec.back() | 返回vector的首、尾元素 |
| vec.push_back() | 从vector末尾加入一个元素 |
| vec.size() | 返回vector当前的长度(大小) |
| vec.pop_back() | 从vector末尾删除一个元素 |
| vec.empty() | 返回vector是否为空,1为空、0不为空 |
| vec.clear() | 清空vector |
queue队列
先进先出,没有clear,也不支持遍历
文档:std::queue - cppreference.com
| 用法 | 作用 |
|---|---|
| q.front(),q.back() | 返回queue的首、尾元素 |
| q.push() | 从queue末尾加入一个元素 |
| q.size() | 返回queue当前的长度(大小) |
| q.pop() | 删除首个元素 |
| q.empty() | 返回queue是否为空,1为空、0不为空 |
stack
后进先出
| 用法 | 作用 |
|---|---|
| st.top() | 返回stack的栈顶元素 |
| st.push() | 从stack栈顶加入一个元素 |
| st.size() | 返回stack当前的长度(大小) |
| st.pop() | 从stack栈顶弹出一个元素 |
| st.empty() | 返回stack是否为空,1为空、0不为空 |
string 容器
string是C++风格的字符串,而string本质上是一个类
string和char * 区别:
- char * 是一个指针
- string是一个类,类内部封装了
char*,管理这个字符串,是一个char*型的容器
string特点:
string 类内部封装了很多成员方法,例如:查找find,拷贝copy,删除delete 替换replace,插入insert
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责
导入:#include
<string>// 注意这里不是string.h,string.h是C字符串头文件
| 用法 | 说明 |
|---|---|
| int find(const string& str, int pos = 0) const; | 查找str第一次出现位置,从pos开始查找 |
| int compare(const string &s) const; | 字符串比较是按字符的ASCII码进行对比,返回值:0:=,1:>,-1:< |
| string& insert(int pos, const string& str); | 插入字符串 |
| string& erase(int pos, int n = npos); | 删除从Pos开始的n个字符 |
| char& operator[](int n);char& at(int n); | 获取单个字符 |
| string substr(int pos = 0, int n = npos) const; | 返回由pos开始的n个字符组成的字符串 |
参考资料:
\0:是一个空字符,在cout中输出是空的,表示字符串的结束
string转成char*
string str;
const char *c = str.c_str();
char*转成string
string str;
const char *pc = "Hello World";
str = pc;
char[]转成string
char ch [] = "ABCDEFG";
string str(ch); //也可string str = ch;
print中注意事项
string str="hello";
printf(“%s\n”, str); //此处出现错误的输出
cout<<str<<endl;
用printf(“%s”,str);输出是会出问题的。这是因为“%s”要求后面的对象的首地址。但是string不是这样的一个类型,若一定要printf输出。那么可以加上.c_str()。
map
map使用红黑树实现。查找时间在O(lg(n))-O(2*log(n))之间,构建map花费的时间比较长
c++中的map是有序的?我使用过其它语言map都是无序的,经测试确实是有序的
map中获取某个值的方法:find,然后再通过first,second来取key和value
map和multimap应该使用那一个?
在项目代码中multimap会多一些
hasp_map
hash_map是 STL 的一部分,但不是标准C++ (C++11) 的一部分。在标准C++中,有一个名为“std::unordered_map”的功能类似unordered_map实现:http://www.cplusplus.com/reference/unordered_map/unordered_map/
C++11 引入了 std::unordered_map和hash_map没有什么不同。
参考资料:https://stackoverflow.com/questions/5908581/is-hash-map-part-of-the-stl
该用hash_map还是map?
hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。
但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。
来源:C++ map和hashmap用法_qq_33216029的博客-CSDN博客_c++ hashmap
set
set容器,有点像C#中的hashset,里面的元素是唯一不重复的,且内部排好序(升序排列)。
set容器自动有序和快速添加、删除的性质是由其内部实现:红黑树(平衡树的一种)
| 用法 | 作用 |
|---|---|
| s.empty() | 当前集合是否为空,是返回1,否则返回0. |
| s.size() | 当前集合的元素个数 |
| s.clear() | 清空当前集合 |
| s.begin(),s.end(); | 返回集合的首尾迭代器。注意是迭代器。我们可以把迭代器理解为数组的下标。但其实迭代器是一种指针 |
| s.insert(k) | 向集合中加入元素k |
| s.erase(k) | 删除集合中元素k |
| s.find(k) | 返回集合中指向元素k的迭代器。如果不存在这个元素,就返回s.end() |
deque
| 用法 | 作用 |
|---|---|
| q.begin(),q.end() | 返回deque的首、尾迭代器 |
| q.front(),q.back() | 返回deque的首、尾元素 |
| q.push_back() | 从队尾入队一个元素 |
| q.push_front() | 从队头入队一个元素 |
| q.pop_back() | 从队尾出队一个元素 |
| q.pop_front() | 从队头出队一个元素 |
| q.clear() | 清空队列 |
deque的特点是双端进出,即处于双端队列中的元素既可以从队首进/出队,也可以从队尾进/出队,它是线性容器。
deque比queue更优秀的一个性质是它支持随机访问,即可以像数组下标一样取出其中的一个元素。
c++所有容器表格


表格数据来源:容器库 - cppreference.com
参考资料
史上最全的各种C++ STL容器全解析 - Seaway-Fu - 博客园 (cnblogs.com)
c++ container容器(string,vector,map,queue,stack等等)的更多相关文章
- vector, map, queue,set常用总结
#include<bits/stdc++.h> using namespace std; vector<,); 定义一个大小为9,初始化全是1的vector数组 set<int ...
- c++ stl 使用汇总(string,vector,map,set)
1.string 1>substr(),截取字串的方法.返回一个从指定位置开始,并具有指定长度的子字符串.参数 start(必选),所需的子字符串的起始位置.字符串中第一个字符的索引为 0.le ...
- C++ STL基本容器的使用(vector、list、deque、map、stack、queue)
1.关联容器和顺序容器 C++中有两种类型的容器:顺序容器和关联容器,顺序容器主要有:vector.list.deque等.关联容器主要有map和set.如下图: 1.vector基本使用 #incl ...
- programming review (c++): (1)vector, linked list, stack, queue, map, string, bit manipulation
编程题常用知识点的review. most important: 想好(1)详尽步骤(2)边界特例,再开始写代码. I.vector #include <iostream> //0.头文件 ...
- stl容器学习——queue,stack,list与string
目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...
- cocos2dx的模板容器简单使用(Vector,Map,Value)
在cocos2dxv3.0beta之前存在顺序性容器cocos2d::CCArray,和cocos2d::CCDictionary.可是在新版本号之后这两个容器都将被cocos2d::Vector&l ...
- day10 集合——队列(Queue)、Vector & Map集合常用方法 & HashMap的实现原理&二叉树&二叉查找树AVL树&红黑树
集合--List 栈先进后出 队列 先进先出 Queue队列 方法 Queue<Integer> q = new LinkedList<>(); //添加元素 q.add(2) ...
- C++关于vector、queue、stack、priority_queue的元素访问
vector.queue.stack.priority_queue对元素进行元素访问时,返回的是对应元素的引用.
- HDU 1113 Word Amalgamation (map 容器 + string容器)
http://acm.hdu.edu.cn/showproblem.php?pid=1113 Problem Description In millions of newspapers across ...
- Go part 4 数据容器(数组,slice,string,map,syncMap,list)
数组 数组是值类型,因此改变副本的值,不会影响到本身 数组的定义:var 变量名 [元素数量] T 变量名(符合标识符要求即可) 元素数量(整型,可以是const中的值) T(可以是任意基本类型,包括 ...
随机推荐
- 火山引擎 DataTester 揭秘:字节如何用 A/B 测试,解决增长问题的?
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 上线六年,字节跳动的短视频产品--抖音已成为许多人记录美好生活的平台.除了抖音,字节跳动旗下还同时运营着数十款 ...
- Lambda 表达式各种用法,你都会了吗
公众号「架构成长指南」,专注于生产实践.云原生.分布式系统.大数据技术分享. 前言 Lambda表达式是 Java 8 中引入的最有影响力的功能之一.它们通过允许简洁而优雅地创建匿名函数来实现 Jav ...
- 什么是离散化?C++实现方法
简介 离散化本质上可以看成是一种 哈希 ,其保证数据在哈希以后仍然保持原来的全/偏序关系. 通俗地讲,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法.离散化本质上是一种哈希 ...
- CodeCraft-21 and Codeforces Round #711 (Div. 2) A~C 个人题解
补题链接:Here 1498A. GCD Sum 题意:给定一个 gcdSum 操作:\(gcdSum(762) = gcd(762,7 + 6 + 2) = gcd(762,15) = 3\) 请问 ...
- Java文件上传与下载压缩
文件上传与下载压缩 文件上传: 这是一个通用的本地文件的上传代码,可以将文件类型存储到相应的本地目录下 注:本次演示为存储路径为项目所在的resources目录下,可通过url去访问本地文件数据适用于 ...
- idea创建父子项目
1. 首先创建大的project 父工程: 2. 点击下一步之后: 3. 点击下一步,填写项目存放地址,点击finish: 4. 完成之后删除不需要的文件,保留pom文件,检查对应的jar和spri ...
- 引入阿里在线图标(微信小程序)
https://www.bilibili.com/video/BV1WJ41197sD?p=49
- P1064-DP【绿】
好多好多天前写了这道题的50分代码,然后不知道错在哪里反复调没调对.然后这周我极度忙,忙死了,好不容易有一点时间再来审视这道题了,然后我5分钟想明白了一切...意识到自己此前的错误有多弱智... 把D ...
- C# 排序算法1: 冒泡排序
本文用控制台程序展示数据排序前后的变化,本文数据都按将从小到大进行排序. 1. 准备arr数据 及 arr数据的展示 /// <summary> /// 生成n个元素的int数组 // ...
- json 解析:marshal 和 unmarshal
Go 使用 encoding/json 包的 marshal 和 unmarshal 实现 json 数据的编解码.分别记录如下: 1. marshal 定义结构体: type OCP struct ...