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类型的更多相关文章

  1. stl容器学习——queue,stack,list与string

    目录 头文件 string 目录部分 1.string的定义及初始化 ① 用一个字符串给另一个字符串赋值 ②用字符串常量对字符串进行赋值 ③ 用n个相同的字符对字符串赋值 2.string的运算符及比 ...

  2. c++ STL 常用容器元素类型相关限制 指针 引用

    c++ 的 STL 中主要有 vector , list, map, set  , multimap,multiset 这些容器完全支持使用内置类型和指针(指针注意内存泄露问题). 就是说乱用智能指针 ...

  3. [STL]string类型的getline函数

    3.cin.getline() 实际是cin.getline(接收字符串到m,接收个数n,结束字符).接收一个字符串,可以接收空格等,最后一个字符为‘\0’.结束符可以通过设置第三个参数自己设置,默认 ...

  4. 把《c++ primer》读薄(3-1 标准库string类型初探)

    督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 问题1:养成一个好习惯,在头文件中只定义确实需要的东西 using namespace std; //建议需要什么再using声 ...

  5. STL容器

    啦啦啦,今天听啦高年级学长讲的STL容器啦,发现有好多东西还是有必要记载的,毕竟学长是身经百战的,他在参加各种比赛的时候积累的经验可不是一天两天就能学来的,那个可是炒鸡有价值的啊,啊啊啊啊啊 #inc ...

  6. STL容器的本质

    http://blog.sina.com.cn/s/blog_4d3a41f40100eof0.html 最近在学习unordered_map里面的散列函数和相等函数怎么写.学习过程中看到了一个好帖子 ...

  7. 不要在公共接口中传递STL容器

    最近的一个项目,是开发一个framework,提供给公司内部不同的产品线使用. 之间遇到的一个问题,就是STL容器的使用, 而结论是不要在公共接口中传递STL容器: 这里说的STL容器,但主要则是指容 ...

  8. STL容器总结

    一. 种类: 标准STL序列容器:vector.string.deque和list. 标准STL关联容器:set.multiset.map和multimap. 非标准序列容器slist和rope.sl ...

  9. C++之string类型详解

    C++之string类型详解 之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个泛型类出现,他集成的操作函 ...

  10. 关于STL容器

    容器: 概念:如果把数据看做物体,容器就是放置这些物体的器物,因为其内部结构不同,数据摆放的方式不同,取用的方式也不同,我们把他们抽象成不同的模板类,使用时去实例化它 分类: 序列容器.关联容器.容器 ...

随机推荐

  1. 【JS 逆向百例】某公共资源交易网,公告 URL 参数逆向分析

    声明 本文章中所有内容仅供学习交流,抓包内容.敏感网址.数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 逆向目标 目标:某地公共资 ...

  2. RabbitMQ集成系统文章02---webForm发布 ABP VNext订阅

    一.webForm项目中发布 1.引用RabbitMQ.Client 2.在你想要发布的地方调用如下的方法 public void PublishRabbitMQ() { var data = new ...

  3. Go 1.21发布!

    原文在这里. 由Eli Bendersky, on behalf of the Go team 发布于 8 August 2023 Go团队今天非常高兴地发布了Go 1.21版本,你可以通过访问下载页 ...

  4. Gin 框架之Cookie与Session

    目录 一.Cookie和Session的由来 二.Cookie简介 1. 什么是Cookie 2. Cookie规范 3. 安全性 4. Cookie 关键配置 三.Session简介 1. 什么是S ...

  5. ElasticSearch安装、插件介绍及Kibana的安装与使用详解

    ElasticSearch安装.插件介绍及Kibana的安装与使用详解 1.安装 ElasticSearch 1.1 安装 JDK 环境 因为 ElasticSearch 是用 Java 语言编写的, ...

  6. Nginx的反向代理做负载均衡

    对于一个大型网站,随着网站的访问量快速增长,单台服务器很难再支撑起需要,所以我们会购置多个服务器来满足业务量的需求,然后再利用Nginx提供的反向代理功能,来实现多台服务器间的协作功能,提高网站的处理 ...

  7. Linux中国开源社区停止运营

    layout: post title: "Linux 中国开源社区停止运营" tags: - "Linux" 昨天看到老王发的公众号文章,Linux中国开源社区 ...

  8. Java-将文本(字符串)转化成二进制字符

    今天在测试MySQL的Blob相关类型时,这种一般存放的是二进制文本,所以就想插入二进制文本. package com.aaa.dao; public class aaa { public stati ...

  9. MyBatis踩坑之单字符条件比较

    背景 Mybatis中可以使用 <choose><when>...</when></choose> 语句来实现条件选择,<when> 标签含 ...

  10. NVME学习笔记杂谈—名词定义

    1.5 定义1.5.1 Admin QueueAdmin Queue 是标识符为 0 的 Submission Queue 和 Completion Queue .Admin Submission Q ...