AndreaDO

导航

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 是用来替换的新字符串。
 

posted on 2024-02-21 23:07  AndreaDO  阅读(28)  评论(0)    收藏  举报