C++ STL 容器-string类型
C++ STL 第一部分-容器
STL的介绍
C++的STL分为六大部分

容器分为

容器的概念
容器内元素的条件
- 1.必须可以复制copy或者搬移move,包括条件是在拷贝和搬移的过程中不存在副作用。
- 2.元素必须可以被赋值操作来复制或者搬移(因为容器和算法对复写的要求)。
- 3.元素可以被销毁
针对不同的容器还有额外的要求:
序列式容器,元素必须有默认构造函数,
对于某些操作,元素需要定义 == std::find
对于关联式容器,排序准则默认是<>std::less
无顺序容器,必须要提供一个hash函数 ==
stl容器里面存放是值而不是引用
STL容器里面的一些操作
//包含STL基本操作的接口
template <typename T >
void containerAllInterface(T& a,T& b)
{
T c;
T d(a);
T e=a;
T f(std::move(a));//move
auto iterB =b.begin();
auto iterE = b.end();
T g(iterB,iterE);//copy
b.size(); //std::forward_list 没有这个接口
b.empty();//类似于return b.size()==0;
b.max_size();
// // STL一般都支持的比较
if(b==c);
if(b!=d);
if(b<e);
e=b;
e=std::move(b);
e.swap(g); //除了std::array不支持
swap(e,g); //除了std::array不支持
e.cbegin(); //等于const_iterator begin
auto ea = e.cbegin();
auto eea = e.begin();
e.cend();
e.clear();
}
String容器
例子1
std::string str1,str2,str3,str4;
str1.assign("abcd"); //给str1赋值abcd
str2.assign("abcd",3); //获取abcd中的3个,从0到2
str3.assign(str1); //获取str1
//注意str3()和str3.assign有区别
//str3.assign(str1); 是对现有 std::string 对象 str3 的修改,将其内容替换为 str1 的内容。
//string str3(str1); 是创建一个新的 std::string 对象 str3,并将其初始化为 str1 的内容。
str4.assign(4,'a'); //返回4个aaaa
std::cout<<str1<<'\n'<<str2<<'\n'<<str3<<'\n'<<str4<<std::endl;
/*
abcd
abc
abcd
aaaa
*/
const char* p="abcd";
std::string str5(p); //abcd c风格转string
const char* p2 = str5.c_str(); //string转Char
例子2
std::string str1;
std::cout<<str1.empty()<<" "<<str1.length()<<" "<<str1.size()<<std::endl;
// 1 0 0
str1="hello";
std::cout<<str1.empty()<<" "<<str1.length()<<" "<<str1.size()<<std::endl;
// 0 5 5
- empty函数返回一个bool,如果有值返回0,无值返回1
- length() 和 size() 的主要区别在于它们的语义和起源。length() 函数更常见于 C 风格的字符串处理,而 size() 函数则是 C++ 引入的,与容器类(如 std::vector、std::list 等)中的 size() 方法保持一致,使得在处理不同类型的集合时具有一致的接口。
例子3
std::string str1("hello");
cout<<str1.at(1)<<endl;;
cout<<str1[1];
//e
//e
for(char &c:str1){
cout<<c<<"---";
c=toupper(c);
//这个函数的作用是将一个小写字母转换为对应的大写字母。如果传递给它的字符不是小写字母,那么它通常返回该字符本身,不做任何改变。
}
- 这里at和[]基本上没有区别,但是at()里参数如果越出了数组范围,会直接报错,而[]是不会报错的,at更加安全
例子4
string str1("abc"),str2("abc");
const char *p="abc";
cout<<str1.compare(str2)<<endl;
cout<<str1.compare("abcd")<<endl;
cout<<str1.compare("ab")<<endl;
cout<<str1.compare(p)<<endl;
/*
0
-1
1
0
*/
总结来说,compare 函数返回 0 表示比较的两个字符串在字典序上是相等的。在这种情况下,所有比较都涉及相同的字符串 "abc",因此都返回 0。如果比较的两个字符串不相等,compare 函数会返回一个非零值,通常是根据两个字符串在字典序中的相对位置来决定的。如果第一个字符串在字典序上小于第二个字符串,compare 会返回一个负数;如果第一个字符串在字典序上大于第二个字符串,compare 会返回一个正数。
例子5
string str1("abc"),str2("abc");
str1.insert(0,"11");
cout<<str1<<endl;
str1.insert(3,str2);
cout<<str1 <<endl;
str1.erase(0,3); //从0开始删除3个字符
cout<<str1 <<endl;
string str3=str1.substr(0,2); //截取从0开始,2长度的字符串
cout<<str3 <<endl;
/*
输出
11abc
11aabcbc
abcbc
ab
*/
### 例子6
string str1="ab111111ab",str2="ab",str3="bc";
cout<<str1.find(str2)<<endl; //只有一个参数就默认从0开始查找
cout<<str1.find(str2,4)<<endl; // 默认从4开始查找
cout<<str1.find(str3)<<endl; // 默认从4开始查找
const char* p="abcd";
cout<<str1.find(p,0,2)<<endl; //表示C++从0开始寻找,这个char前两个在str1中的位置,第一个参数只能是char类型
/*
0
8
18446744073709551615
0
*/
在string的find中默认从0开始查找,如果没有找到子字符串,find 函数返回 std::string::npos
**std::string::npos**的值是 4294967295(对于 32 位无符号整数)或 18446744073709551615
string str1="ab111111ab",str2="zzz",str3="bc";
cout<<str1.replace(0,2,str2)<<endl;
//输出 zzz111111ab
* str1.replace(0, 2, str2) 调用 replace 函数来修改 str1。
* 第一个参数 0 是替换开始的位置索引。
* 第二个参数 2 是要替换的子字符串的长度。
* 第三个参数 str2 是用来替换的新字符串。
C++ STL 容器-string类型的更多相关文章
- stl容器学习——queue,stack,list与string
目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...
- c++ STL 常用容器元素类型相关限制 指针 引用
c++ 的 STL 中主要有 vector , list, map, set , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...
- [STL]string类型的getline函数
3.cin.getline() 实际是cin.getline(接收字符串到m,接收个数n,结束字符).接收一个字符串,可以接收空格等,最后一个字符为‘\0’.结束符可以通过设置第三个参数自己设置,默认 ...
- 把《c++ primer》读薄(3-1 标准库string类型初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...
- STL容器
啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...
- STL容器的本质
http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...
- 不要在公共接口中传递STL容器
最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...
- STL容器总结
一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...
- C++之string类型详解
C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...
- 关于STL容器
容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...
随机推荐
- 小白学k8s(6)使用kubespray部署k8s
kubespray部署k8s 准备 需要关闭防火墙 配置hosts 处理镜像 配置文件 运行 通过对应的镜像 运行代码 查看结果 出现的问题 墙 错误的配置 kubespray部署k8s 准备 kub ...
- 【3】VSCode 主题设置推荐,自定义配色方案,修改注释高亮颜色
相关文章: [一]tensorflow安装.常用python镜像源.tensorflow 深度学习强化学习教学 [二]tensorflow调试报错.tensorflow 深度学习强化学习教学 [三]t ...
- LyScript 插件实现自定义反汇编
LyScript 插件默认提供了一个get_disasm_code()方法可以直接获取到指定行数的反汇编代码,但如果需要自定义获取或者是需要自己封装一个反汇编方法,则你可以用如下两种方式来得到. 插件 ...
- T406696 『STA - R4』冰红茶 题解
题目链接:冰红茶 比较有意思的套路题(前提是接触过) 首先,一个最基本的线段树包含两种操作的板子要会,分别为区间赋值与区间加,同时维护区间最值.这个挺简单的,区间赋值优先级高于区间加,可以将区间加覆盖 ...
- (C语言)每日代码||2023.12.23||for循环的循环条件部分可以是数字
#include <stdio.h> int main() { int i = 3; for (i; i; i--) { printf("%d\n", i); } // ...
- HBase-Hbase启动异常java.lang.IllegalArgumentException: object is not an instance of declaring class
1.问题描述 HBase启动时异常如下: java.lang.IllegalArgumentException: object is not an instance of declaring clas ...
- C++——异常处理模块笔记
异常处理是C++中的重要概念之一,用于处理在程序执行过程中可能发生的错误或异常情况.异常是指在程序执行过程中发生的一些不寻常的事件,例如除零错误.访问无效内存等.C++提供了一套异常处理机制,使得程序 ...
- C#后端接收前端的参数
接收参数 1. 直接使用 [FromBody] 特性来告诉 ASP.NET Core 将请求的 JSON 数据反序列化为 实体类 对象 [FromBody] BlogNewsDTO实体类 点击查看代码 ...
- NC50243 小木棍
题目链接 题目 题目描述 乔治有一些同样长的小木棍,他把这些木棍随意砍成几段,直到每段的长都不超过50.现在,他想把小木棍拼接成原来的样子,但是却忘记了自己开始时有多少根木棍和它们的长度.给出每段小木 ...
- 普冉PY32系列(十一) 基于PY32F002A的6+1通道遥控小车II - 控制篇
目录 普冉PY32系列(一) PY32F0系列32位Cortex M0+ MCU简介 普冉PY32系列(二) Ubuntu GCC Toolchain和VSCode开发环境 普冉PY32系列(三) P ...