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容器
容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...
随机推荐
- echasrts定义折线图legend的样式-优化
option = { title: { text: '折线图堆叠' }, tooltip: { trigger: 'axis' }, //定义折线图legend的形状哈 legend: { itemW ...
- 每日一库:cobra 简介
当你需要为你的 Go 项目创建一个强大的命令行工具时,你可能会遇到许多挑战,比如如何定义命令.标志和参数,如何生成详细的帮助文档,如何支持子命令等等.为了解决这些问题,github.com/spf13 ...
- 小白学k8s(6)使用kubespray部署k8s
kubespray部署k8s 准备 需要关闭防火墙 配置hosts 处理镜像 配置文件 运行 通过对应的镜像 运行代码 查看结果 出现的问题 墙 错误的配置 kubespray部署k8s 准备 kub ...
- 数据挖掘[一]---汽车车交易价格预测(测评指标;EDA)
题目出自阿里天池赛题链接:零基础入门数据挖掘 - 二手车交易价格预测-天池大赛-阿里云天池 相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据 ...
- 驱动开发:Win10枚举完整SSDT地址表
在前面的博文<驱动开发:Win10内核枚举SSDT表基址>中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则 ...
- C/C++ 结构体与指针笔记
结构体的定义与使用: #include <stdio.h> #include <stdlib.h> struct Student { int num; char name[30 ...
- C++ Boost库 操作日期与时间
Boost库中默认针对日期与时间的操作库分为,timer,progress_timer,date_time这几类,如下是一些常用的使用方法总结. timer库 #include <iostrea ...
- ChatGPT 对接微信公众号技术方案实现!
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 9天假期写了8天代码和10篇文章,这个5.1过的很爽! 如假期前小傅哥的计划一样,这个假期开启 ...
- 解决github无法进入问题,DNS加速
1.电脑的hosts文件在下面这个地址,找到hosts文件 C:\Windows\System32\Drivers\etc 2.进入文件夹目录etc 找到hosts文件,使用记事本编辑 3.进入这个网 ...
- iOS测试包的安装方法
iOS测试包根据要安装的机器类型可以分为2种: .app模拟器测试包 .ipa真机测试包 .app模拟器测试包的安装方式 方式一:Xcode生成安装包 1.Xcode运行项目,生成app包 2.将AP ...