首页 > 编程语言 >c++ container容器(string,vector,map,queue,stack等等)

c++ container容器(string,vector,map,queue,stack等等)

时间:2022-10-16 22:33:07浏览次数:91  
标签:返回 map container string 元素 char str

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的构造速度较慢。



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++所有容器表格

c++ container容器(string,vector,map,queue,stack等等)_字符串

c++ container容器(string,vector,map,queue,stack等等)_迭代器_02

标签:返回,map,container,string,元素,char,str
From: https://blog.51cto.com/zhaoqingqing/5760748

相关文章

  • containerd镜像拉取配置
    背景:公司要求部署最一套新版的k8s系统来部署生产应用,说实话很头疼。因为k8s自1.23版本之后就用不docker作为容器的默认运行时了,而是采用的containerd,这就带来了一系列......
  • 关于ToString()、ToKnowColor()及属性返回值为类类型的理解
    1usingSystem;2usingSystem.Collections.Generic;3usingSystem.Linq;4usingSystem.Text;5usingSystem.Drawing;6usingSystem.Windows.Forms......
  • leetCode [76. Minimum Window Substring]
    [76.MinimumWindowSubstring](https://leetcode.cn/problems/minimum-window-substring/)滑动窗口此题需要求s中包含t的最小字符串,运用滑动窗口可解定义:我们需......
  • OCI runtime exec failed: exec failed: unable to start container process: exec: "
    前言:今天按照以往在Docker安装MongoDB的方式安装,但是到最后使用mongo命令执行mongodb命令的时候一直执行不成功,最后还是按照官网的Issues解决了。创建并运行一个Mong......
  • reids:String类型
    String类型,也就是字符串类型,是Redis中最简单的存储类型。其value是字符串,不过根据字符串的格式不同,又可以分为3类:string:普通字符串int:整数类型,可以做自增、自减操作......
  • redis bitmap数据结构之java对等操作
    在之前的文章中,我们有说过bitmap,bitmap在很多场景可以应用,比如黑白名单,快速判定,登录情况等等。总之,bitmap是以其高性能出名。其基本原理是一位存储一个标识,其他衍生知......
  • hashmap组成原理及调用时机
    整个HashMap中最重要的点有四个:初始化,数据寻址-hash方法,数据存储-put方法,扩容-resize方法,只要理解了这四个点的原理和调用时机,也就理解了整个HashMap的设计。 如果有疑......
  • 【C++】统计string里面出现的字符的个数(使用count函数)
    题目:给出一个string字符串,统计里面出现的字符的个数解决方案:使用算法库<algorithm>里面的count函数(不是s.count()!!count是单独作为一个函数,而不是作为一个方法),使用方法是......
  • SQL语句:如何将int类型强转为string类型
    cast(xxxasvarchar)因为string在sql语句里面根本无法被识别,使用char又不能成功转换,上面非常巧妙的用到了varcahr来替代string,亲测有效十分好用!做一个小小的记录,继续加......
  • Hadoop MapReduce
    学习MapReduce,首先要理解它的思想——分而治之,先分再合,分而治之,所谓的分而治之,意思就是将一个复杂的问题,按照一定的分解方法分解为规模较小的若干的部分,再逐个解决,分别找出......