目录

容器的分类

string

string的概念

string的初始化

string的遍历

string的一些基本操作

char*类型和string类型互转

字符串的连接

字符串的查找和替换

string的截断和删除


容器的分类

在实际的开发过程中,数据结构本身的重要性不会逊于操作于数据结构的算法的重要性,当程序中存在着对时间要求很高的部分时,数据结构的选择就显得更加重要。

经典的数据结构数量有限,但是我们常常重复着一些为了实现向量、链表等结构而编写的代码,这些代码都十分相似,只是为了适应不同数据的变化而在 细节上有所出入。STL容器就为我们提供了这样的方便,它允许我们重复利用已有的实现构造自己的特定类型下的数据结构,通过设置一些模板,STL容器对最常用的数据结构提供了支持,这些模板的参数允许我们指定容器中元素的数据类型,可以将我们许多重复而乏味的工作简化。

容器部分主要由头文 件<vector>,<list>,<deque>,<set>,<map>,<stack> 和<queue>组成。

序列式容器(Sequence containers)

每个元素都有固定位置--取决于插入时机和地点,和元素值无关。

        vector、deque、list  

关联式容器(Associated containers)

元素位置取决于特定的排序准则,和插入顺序无关

        set、multiset、map、multimap

数据结构

描述

实现头文件

向量(vector)

连续存储的元素

<vector>

列表(list)

由节点组成的双向链表,每个结点包含着一个元素

<list>

双队列(deque)

连续存储的指向不同元素的指针所组成的数组

<deque>

集合(set)

由节点组成的红黑树,每个节点都包含着一个元素,节点之间以某种作用于元素对的谓词排列,没有两个不同的元素能够拥有相同的次序

<set>

多重集合(multiset)

允许存在两个次序相等的元素的集合

<set>

栈(stack)

后进先出的值的排列

<stack>

队列(queue)

先进先出的执的排列

<queue>

优先队列(priority_queue)

元素的次序是由作用于所存储的值对上的某种谓词决定的的一种队列

<queue>

映射(map)

由{键,值}对组成的集合,以某种作用于键对上的谓词排列

<map>

多重映射(multimap)

允许键对有相等的次序的映射

<map>

string

string的概念

  • string是STL的字符串类型,通常用来表示字符串。而在使用string之前,字符串通常是用char*表示的。string与char*都可以用来表示字符串,那么二者有什么区别呢。

string和char*的比较

  • string是一个类, char*是一个指向字符的指针。

string封装了char*,管理这个字符串,是一个char*型的容器。

  • string不用考虑内存释放和越界。

string管理char*所分配的内存。每一次string的复制,取值都由string类负责维护,不用担心复制越界和取值越界等。

  • string提供了一系列的字符串操作函数

查找find,拷贝copy,删除erase,替换replace,插入insert

string的初始化

string主要有四种初始化的方式。

  • 默认构造函数:

string();    //构造一个空的字符串string s1。

  • 拷贝构造函数:

string(const string &str); //构造一个与str一样的string。如string s1(s2)。

  • 带参数的构造函数

string(const char *s);    //用字符串s初始化

string(int n,char c);    //用n个字符c初始化

void main21()
{string s1 = "aaaa";string s2("bbbb");string s3 = s2;//通过拷贝构造函数来初始化对象string s4(10, 'a');cout << "s1:" << s1 << endl;cout << "s2:" << s2 << endl;cout << "s3:" << s3 << endl;cout << "s4:" << s4 << endl;
}

string的遍历

string主要有两种方式,一种是通过数组的方式进行遍历,另外一种是通过迭代器的方式进行遍历,数组方式出现错误的时候不会向外抛出异常,而迭代器会。

//string的遍历
void main22()
{string s1 = "abcdefg";//1 数组方式for (int i = 0; i < s1.length(); i++){cout << s1[i] << " ";//出现错误不向外面抛出异常引起程序的中断}cout << endl;//2 迭代器for (string::iterator it = s1.begin(); it != s1.end(); it++){cout << *it << " ";}cout << endl;try{for (int i = 0; i < s1.length()+3; i++){cout << s1.at(i) << " ";//抛出异常}}catch (...){cout << "发生异常\n";}cout << endl;
}

string的一些基本操作

char*类型和string类型互转

const char *c_str() const;   //返回一个以'\0'结尾的字符串的首地址.

//字符指针和string的转换
void main23()
{string s1 = "aaabbb";//1 s1===>char *printf("s1:%s\n", s1.c_str());//2 char *===>string//3 s1的内容copy buf中char buf[128] = { 0 };s1.copy(buf, 3, 0);//注意 只给你copy3个字符 不会加\0cout << "buf1:" << buf << endl;}

字符串的连接

string &operator+=(const string &s);  //把字符串s连接到当前字符串结尾

string &operator+=(const char *s);//把字符串s连接到当前字符串结尾

string &append(const char *s);    //把字符串s连接到当前字符串结尾

string &append(const char *s,int n);  //把字符串s的前n个字符连接到当前字符串结尾

string &append(const string &s);   //同operator+=()

string &append(const string &s,int pos, int n);//把字符串s中从pos开始的n个字符连接到当前字符串结尾

string &append(int n, char c);   //在当前字符串结尾添加n个字符c

//字符串的连接
void main24()
{string s1 = "aaa";string s2 = "bbb";s1 = s1 + s2;cout << s1 << endl;string s3 = "333";string s4 = "444";s3.append(s4);cout << s3 << endl;
}

字符串的查找和替换

查找

int find(char c,int pos=0) const;  //从pos开始查找字符c在当前字符串的位置

int find(const char *s, int pos=0) const;  //从pos开始查找字符串s在当前字符串的位置

int find(const string &s, int pos=0) const;  //从pos开始查找字符串s在当前字符串中的位置

find函数如果查找不到,就返回-1

int rfind(char c, int pos=npos) const;   //从pos开始从后向前查找字符c在当前字符串中的位置

int rfind(const char *s, int pos=npos) const;

int rfind(const string &s, int pos=npos) const;

//rfind是反向查找的意思,如果查找不到, 返回-1

替换

string &replace(int pos, int n, const char *s);//删除从pos开始的n个字符,然后在pos处插入串s

string &replace(int pos, int n, const string &s);  //删除从pos开始的n个字符,然后在pos处插入串s

void swap(string &s2);    //交换当前字符串与s2的值

//字符串的查找和替换
void main25()
{string s1 = "wbm hello wbm 111 wbm 222 wbm 333";//查找第一次wbm indexint index = s1.find("wbm", 0);//位置下标从0开始cout << "index:" << index << endl;//求wbm出现的次数 每一次出现的数组下标int offindex = s1.find("wbm", 0);while (offindex!=string::npos){cout << "offindex:" << offindex << endl;offindex = offindex + 1;offindex = s1.find("wbm", offindex);}//替换 把小写换成大写string s3 = "aaa bbb ccc";s3.replace(0, 3, "AAA");cout << "s3:" << s3 << endl;offindex = s1.find("wbm", 0);while (offindex != string::npos){cout << "offindex:" << offindex << endl;s1.replace(offindex, 3, "WBM");offindex = offindex + 1;offindex = s1.find("wbm", offindex);}cout << "s1:" << s1 << endl;
}

string的截断和删除

string &insert(int pos, const char *s);

string &insert(int pos, const string &s);

//前两个函数在pos位置插入字符串s

string &insert(int pos, int n, char c);  //在pos位置 插入n个字符c

string &erase(int pos=0, int n=npos);  //删除pos开始的n个字符,返回修改后的字符串

//截断和删除
void main26()
{string s1 = "hello1 hello2 hello1";string::iterator it = find(s1.begin(), s1.end(), 'l');while (it != s1.end()){s1.erase(it);it = find(it, s1.end(), 'l');}cout << "s1:" << s1 << endl;s1.erase(s1.begin(), s1.end());cout << "s1:" << s1 << endl;cout << "s1.length():" << s1.length() << endl;string s2 = "BBB";s2.insert(0, "AAA"); // 头插法cout << "s2:" << s2 << endl;s2.insert(s2.length(), "CCC");cout << "s2:" << s2 << endl;
}

string算法相关

将字符串的大小写互相转换的函数

void main27()
{string s1 = "AAAbbb";//函数的入口地址 函数对象 预定义的函数transform(s1.begin(), s1.end(), s1.begin(), toupper);cout << s1 << endl;string s2 = "AAAbbb";transform(s2.begin(), s2.end(), s2.begin(), tolower);cout << s2 << endl;
}

c++之STl容器-string相关推荐

  1. VScode调试C++代码时无法查看STL容器(string、vector等)

    如下图所示:用VScode调试C++代码时,无法显示我们想要的值. 解决方法:编辑launch.json,加入如下设置: "setupCommands": [{"desc ...

  2. C++ STL 容器 string

    1 string string内部含有一个char*字符串 2 string构造方式 无参构造 string str; 字符串构造 string str("abcd"); 拷贝构造 ...

  3. C++STL的string容器

    C++STL的string容器 string容器 string基本概念 string构造函数 string赋值操作 string字符串拼接 string查找和替换 string字符串比较 string ...

  4. c++STL容器的string

    STL容器的string String概念 string是一个类, char*是一个指向字符的指针. string不用考虑内存释放和越界. string提供了一系列的字符串操作函数 string的构造 ...

  5. C++ 笔记(19)— 标准模板库(STL容器、STL迭代器、STL算法、STL容器特点、STL字符串类)

    C++ 标准库可以分为两部分: 标准函数库: 这个库是由通用的.独立的.不属于任何类的函数组成的.函数库继承自 C 语言. 面向对象类库: 这个库是类及其相关函数的集合. C++ 标准库包含了所有的 ...

  6. STL 的string类怎么啦?

    STL 的string类怎么啦? 陈皓 前言 上个周末在和我的同学爬香山闲聊时,同学说到STL中的string类曾经让他备受折磨,几年前他开发一个系统前对string类还比较清楚,然后随着程序的复杂度 ...

  7. gdb 查看 stl容器 zz

    将下面文件作为 ~/.gdbinit的内容, 或者在已有的~/.gdbinit中source下面的文件, 然后可以以下列方式查看stl容器的数据:  容器类型 GDB 命令 std::vector&l ...

  8. 标准非STL容器 : bitset

    1. 概念 什么是"标准非STL容器"?标准非STL容器是指"可以认为它们是容器,但是他们并不满足STL容器的所有要求".前文提到的容器适配器stack.que ...

  9. C++STL容器大全

    该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105044302 S ...

最新文章

  1. 用v-for循环动态定位坐标显示元素,并遍历元素的left和top坐标位置(只需要用到元素的宽高、索引、每行显示数量)
  2. 科学家都解决不了的5个“简单”算法,你不来看看?
  3. ksql 数量大于2_504深入解读路基土石方说明,路基填方数量组成?运距>15km咋办...
  4. python采集文章_八爪鱼采集器能取代python爬虫吗?
  5. 残缺棋盘的伪代码_伪激光雷达:无人驾驶的立体视觉
  6. 塞内加尔将于5月启用全国首个大型数据中心
  7. 图片在线转换base64
  8. jzoj5698-[gdoi2018day1]密码锁【贪心,差分】
  9. Wordpress基础:精简头部wp_head
  10. Module build failed: Error: Node Sass version 5.0.0 is incompatible with ^4.0.0.
  11. mysql pool返回值_【Mysql】你知道一条查询语句是如何执行的吗?
  12. java tcp ack_TCP三次握手和四次挥手以及11种状态
  13. 如何正确在Facebook投放产品广告?
  14. web app iphone4 iphone5 iphone6 iphone6 Plus响应式布局 适配代码
  15. python小trick持续更新~
  16. c3p0数据库连接池不能取到连接
  17. Html 垂直滚动条 定位到 指定位置
  18. DeepSpeech语音转文本合成技术
  19. AD20和立创EDA设计(2)提取立创EDA的原理图库和PCB库
  20. 如何用viso画波浪线、以及带箭头的波浪线。

热门文章

  1. Java——将一个正整数分解质因数
  2. Oracle中todate函数的使用
  3. 区块链架构与交易流程(fabric1.0)
  4. Arduino 浊度传感器 TS300B 的使用
  5. TFT-LCD屏幕填充颜色(FSMC)
  6. IDEA javadoc快捷键
  7. STM32闭环步进电机驱动器方案,原理图,源码,PCB
  8. Redis数据库相关指令
  9. 【快速上手教程1】开源编队无人机-开机测试
  10. H3C服务器修改HDM密码,H3C服务器配置HDM远程管理系统