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容器
容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...
随机推荐
- 【python】SSTI模版注入
0x00 Python Vene环境及介绍 venv虚拟环境:创建和管理虚拟环境的模块 首先apt update更新一下包管理 安装你当前版本的python-venv 选择一个目录,安装venv虚拟 ...
- [置顶] Gin--Begoo框架快速指南
Gin篇 第一篇: Gin-官方文档 第二篇: Gin-安装,修改启动端口,get/post 请求参数,模型绑定shouldbind,自定义验证器/表单验证 第三篇: Gin-上传文件/返回前端.中间 ...
- Dto中使用正则校验规则,保证传入数据的正确性
使用RegularExpression
- 快递单中抽取关键信息【一】----基于BiGRU+CR+预训练的词向量优化
相关文章: 1.快递单中抽取关键信息[一]----基于BiGRU+CR+预训练的词向量优化 2.快递单信息抽取[二]基于ERNIE1.0至ErnieGram + CRF预训练模型 3.快递单信息抽取[ ...
- C/C++ 数据结构与算法笔记
实现顺序表 #include <stdio.h> #include <stdlib.h> #define MaxSize 10 int Insert_Elem(int Arra ...
- OpenSSH 服务配置与管理
SSH 是一种以安全的方式提供远程登陆的协议,也是目前远程管理Linux系统的首选方式,SSH由IETF的网络小组所制定,SSH为建立在应用层基础上的安全协议,SSH是目前较可靠,专为远程登录会话和其 ...
- 数据共享Manager(Python)
from multiprocessing import Process,Manager,Lock def change_dic(dic,lock): with lock: dic['count'] - ...
- Git企业开发控制理论和实操-从入门到深入(五)|标签管理
前言 那么这里博主先安利一些干货满满的专栏了! 首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助. 高质量博客汇总 然后就是博主最近最花时间的一 ...
- Program文件的作用
Program.cs文件分析 Program.cs文件是至关重要的一个文件,它包含应用程序启动的代码,还可以配置所需要的服务和应用管道的中间件. 需要掌握: 6.0版本前后生成的Program.cs文 ...
- [ Skill ] append1, append, nconc, tconc, lconc, cons 效率对比
https://www.cnblogs.com/yeungchie/ 先说结论:cons > tconc, lconc >> nconc > append1, append a ...