黑马c++ STL部分 笔记(2) string容器

简介: 黑马c++ STL部分 笔记(2) string容器

char*是指针

string是类,类内部封装了char*,管理这个字符串,是一个char*型的容器

函数:find,copy,delete,replace,insert等

1.构造string

// string的构造方式:
// 1 string() 创建一个空字符串 =string str
// 2 string(const char* s) 用s初始化
// 3 string(const string& str) 拷贝构造
// 4 string(int n,char c) n个字符c初始化
#include <bits/stdc++.h>
using namespace std;
void test01()
{
  string s1; // 1 默认构造
  const char *str = "hello world";
  string s2(str);
  cout << "s2= " << s2 << endl; // 2 用s初始化 这里没有const是因为str已经是常量了
  string s3(s2);
  cout << "s3= " << s3 << endl; // 3 拷贝构造 不用const原因同2
  string s4(10, 'a');
  cout << "s4= " << s4 << endl; // 4 n个字符c初始化
}
int main()
{
  test01();
}


2.string的赋值

// string的赋值操作
// 1 string& operator=(const char* s);//char*类型字符串,赋值给当前字符串
// 2 string& operator=(const string &s);//把字符串s赋给当前字符串
// 3 string& operator=(char c);//字符赋给当前字符串
// 4 string& assign(const char* s);//同1
// 5 string& assign(const char* s,int n);把字符串s前n个字符赋给当前字符串
// 6 string& assign(const string &s);//同2
// 7 string& assign(int n,char c);//n个字符c赋给字符串
#include <bits/stdc++.h>
using namespace std;
void test01()
{
  string str1;
  str1 = "hello world"; // 1
  // cout<<str1;//hello world
  string str2 = str1; // 2
  // cout<<str2;//hello world
  string str3;
  str3 = 'a'; // 3
  // cout<<str3;//a
  string str4;
  str4.assign("hello c++"); // 4
  // cout<<str4;//hello c++
  string str5;
  str5.assign("hello c++", 5); // 5
  // cout<<str5;//hello
  string str6;
  str6.assign(str5); // 6
  // cout<<str6;//hello
  string str7;
  str7.assign(10, 'b'); // 7
  cout << str7;         // bbbbbbbbbb
}
int main()
{
  test01();
}


3.string的拼接

// string字符串拼接:实现在字符串末尾拼接字符串
// 1 string& operator+=(const char* str)重载+=操作符
// 2 string& operator+=(const char c)重载+=操作符
// 3 string& operator+=(const string& str)重载+=操作符
// 4 string& append(const char* s)把字符串s连接到当前字符串结尾
// 5 string& append(const char* s,int n)把字符串s的前n个字符连接到当前字符串的结尾
// 6 string& append(const string &s)同3operator+=(const string& str)
// 7 string& append(const string &s,int pos,int n)把字符串s中从pos开始的n个字符连接到字符串结尾
 
#include <bits/stdc++.h>
using namespace std;
void test01()
{
  string str1 = "我";
  str1 += "爱玩游戏"; // 1
  // cout<<str1;//我爱玩游戏
  str1 += ':'; // 2
  // cout<<str1;//2我爱玩游戏:
  string str2 = " LOL DNF";
  str1 += str2; // 3
  // cout<<str1;//我爱玩游戏: LOL DNF
  string str3 = "I";
  str3.append(" love "); // 4
  // cout << str3;// I love
  str3.append("game abcde", 4); // 5
  // cout << str3;// I love game
   str3.append(str2);//6
  // cout<<str3;//I love game LOL DNF
  string str4="I love game";
  str4.append(str2, 0, 4); // 7
  //cout << str4;// I love game LOL
   string str5="I love game";
  str5.append(str2, 4, 3); // 7
  cout << str5;// I love game DNF
}
int main()
{
  test01();
}


4.string的查找与替换  

// string的查找和替换
// 1 int find(const string& str, int pos = 0) const; //查找str第一次出现位置,从pos开始查找
// 2 int find(const char* s, int pos = 0) const;     //查找s第一次出现位置,从pos开始查找
// 3 int find(const char* s, int pos, int n) const;  //从pos位置查找s的前n个字符第一次位置
// 4 int find(const char c, int pos = 0) const;      //查找字符c第一次出现位置
// 5 int rfind(const string& str,int pos = npos) const;//查找str最后一次位置,从pos开始查找
// 6 int rfind(const char* s, int pos = npos) const; //查找s最后一次出现位置,从pos开始查找
// 7 int rfind(const char* s, int pos, int n) const; //从pos查找s的前n个字符最后一次位置
// 8 int rfind(const char c, int pos = 0) const;     //查找字符c最后一次出现位置
// 9 string& replace(int pos, int n, const string& str);//替换从pos开始n个字符为字符串str
// 10 string& replace(int pos, int n,const char* s);  //替换从pos开始的n个字符为字符串
 
/*find查找是从左往后找第一个,rfind从右往左找第一个
find找到字符串后返回查找的第一个字符位置,找不到返回-1
replace在替换时,要指定从哪个位置起,多少个字符,替换成什么样的字符串
*/
#include <bits/stdc++.h>
using namespace std;
// 查找
void test01()
{
  string str1 = "abcdefgde";
  cout << "1:  " << str1.find("de") << endl;  // 查"def"在str1的哪个位置 //3
  cout << "1:  " << str1.find("df") << endl;  // 查"df"在str1的哪个位置 //很大的数字 or -1
  cout << "5:  " << str1.rfind("de") << endl; // 7
}
// 替换
void test02()
{
  string str1 = "abcdefg";
  string str2 = str1.replace(1, 3, "1111");
  cout << "9:  " << str2; // a1111efg 不是a1111defg,因为d被覆盖
}
int main()
{
  test01();
  test02();
}


5.string字符串比较

// string字符串比较 一般比较string相等
// 1 int compare(const string &s) const;       //与字符串s比较
// 2 int compare(const char *s) const;        //与字符串s比较
/*string字符串比较(从左往右依次比较ASCLL码)
= 返回 0
> 返回 1
< 返回 -1*/
#include <bits/stdc++.h>
using namespace std;
// 比较
void test01()
{
  string str1 = "hello";
  string str2 = "hello";
  if (str1.compare(str2) == 0)
  {
    cout << "=" << endl; //=
  }
  str2 = "zello";
  if (str1.compare(str2) < 0)
  {
    cout << "<" << endl; //<
  }
  str2 = "aello";
  if (str1.compare(str2) > 0)
  {
    cout << ">" << endl; //>
  }
}
 
int main()
{
  test01();
}


6.string的存取  

// string字符存取
// 1 char& operator[](int n);//通过[]方式取字符
// 2 char& at(int n);//通过at方式取字符
#include <bits/stdc++.h>
using namespace std;
// 比较
void test01()
{
  // 访问字符
  string str1 = "hello";
  for (int i = 0; i < str1.size(); i++) // size返回字符串长度
  {
    cout << str1[i] << " "; // h e l l o
  }
  cout << endl;
  for (int i = 0; i < str1.size(); i++) // size返回字符串长度
  {
    cout << str1.at(i) << " "; // h e l l o
  }
  cout << endl;
  // 修改字符
  str1[0] = 'x';
  cout << str1 << endl; // xello
  str1.at(0) = 'y';
  cout << str1 << endl; // yello
}
 
int main()
{
  test01();
}


7.string的插入和删除  

// string的插入和删除
// 1 string& insert(int pos,const char* s);//在pos位置插入字符串
// 2 string& insert(int pos,const string& s);//在pos位置插入字符串
// 3 string& insert(int pos,int n,char c);//在pos位置插入n个字符c
// 4 string& erase(int pos,int n=npos);//删除从pos开始的n个字符
#include <bits/stdc++.h>
using namespace std;
 
void test01()
{ // 插入
  string str = "hello";
  str.insert(1, "111");
  cout << str << endl; // h111ello
  str.erase(1, 3);
  cout << str << endl; // hello
}
 
int main()
{
  test01();
}


8.string求字串

// string求字串
// string substr(int pos=0,int n=npos) const;返回由pos开始的n个字符串组成的字符串
#include <bits/stdc++.h>
using namespace std;
 
void test01()
{
  string str = "abcdef";
  string subStr = str.substr(1, 3);
  cout << subStr << endl; // bcd
}
// 使用操作
void test02()
{
  string email = "zhangsan@sina.com";
  // 从邮箱中获取用户名信息
  int length = email.find("@");
  string username = email.substr(0, length); // length=8
  cout << username << endl;                  // zhangsan
}
int main()
{
  test01();
  test02();
}


相关文章
|
3月前
|
编译器 C++ 容器
【c++丨STL】基于红黑树模拟实现set和map(附源码)
本文基于红黑树的实现,模拟了STL中的`set`和`map`容器。通过封装同一棵红黑树并进行适配修改,实现了两种容器的功能。主要步骤包括:1) 修改红黑树节点结构以支持不同数据类型;2) 使用仿函数适配键值比较逻辑;3) 实现双向迭代器支持遍历操作;4) 封装`insert`、`find`等接口,并为`map`实现`operator[]`。最终,通过测试代码验证了功能的正确性。此实现减少了代码冗余,展示了模板与仿函数的强大灵活性。
101 2
|
17天前
|
对象存储 C++ 容器
c++的string一键介绍
这篇文章旨在帮助读者回忆如何使用string,并提醒注意事项。它不是一篇详细的功能介绍,而是一篇润色文章。先展示重载函数,如果该函数一笔不可带过,就先展示英文原档(附带翻译),最后展示代码实现与举例可以直接去看英文文档,也可以看本篇文章,但是更建议去看英文原档。那么废话少说直接开始进行挨个介绍。
|
4月前
|
存储 安全 C语言
C++ String揭秘:写高效代码的关键
在C++编程中,字符串操作是不可避免的一部分。从简单的字符串拼接到复杂的文本处理,C++的string类为开发者提供了一种更高效、灵活且安全的方式来管理和操作字符串。本文将从基础操作入手,逐步揭开C++ string类的奥秘,帮助你深入理解其内部机制,并学会如何在实际开发中充分发挥其性能和优势。
|
3月前
|
存储 算法 C++
【c++丨STL】map/multimap的使用
本文详细介绍了STL关联式容器中的`map`和`multimap`的使用方法。`map`基于红黑树实现,内部元素按键自动升序排列,存储键值对,支持通过键访问或修改值;而`multimap`允许存在重复键。文章从构造函数、迭代器、容量接口、元素访问接口、增删操作到其他操作接口全面解析了`map`的功能,并通过实例演示了如何用`map`统计字符串数组中各元素的出现次数。最后对比了`map`与`set`的区别,强调了`map`在处理键值关系时的优势。
209 73
|
3月前
|
存储 算法 C++
【c++丨STL】set/multiset的使用
本文深入解析了STL中的`set`和`multiset`容器,二者均为关联式容器,底层基于红黑树实现。`set`支持唯一性元素存储并自动排序,适用于高效查找场景;`multiset`允许重复元素。两者均具备O(logN)的插入、删除与查找复杂度。文章详细介绍了构造函数、迭代器、容量接口、增删操作(如`insert`、`erase`)、查找统计(如`find`、`count`)及`multiset`特有的区间操作(如`lower_bound`、`upper_bound`、`equal_range`)。最后预告了`map`容器的学习,其作为键值对存储的关联式容器,同样基于红黑树,具有高效操作特性。
139 3
|
4月前
|
存储 缓存 C++
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
C++ 标准模板库(STL)提供了一组功能强大的容器类,用于存储和操作数据集合。不同的容器具有独特的特性和应用场景,因此选择合适的容器对于程序的性能和代码的可读性至关重要。对于刚接触 C++ 的开发者来说,了解这些容器的基础知识以及它们的特点是迈向高效编程的重要一步。本文将详细介绍 C++ 常用的容器,包括序列容器(`std::vector`、`std::array`、`std::list`、`std::deque`)、关联容器(`std::set`、`std::map`)和无序容器(`std::unordered_set`、`std::unordered_map`),全面解析它们的特点、用法
C++ 容器全面剖析:掌握 STL 的奥秘,从入门到高效编程
|
4月前
|
C++
模拟实现c++中的string
模拟实现c++中的string
|
4月前
|
存储 算法 C++
【c++丨STL】priority_queue(优先级队列)的使用与模拟实现
本文介绍了STL中的容器适配器`priority_queue`(优先级队列)。`priority_queue`根据严格的弱排序标准设计,确保其第一个元素始终是最大元素。它底层使用堆结构实现,支持大堆和小堆,默认为大堆。常用操作包括构造函数、`empty`、`size`、`top`、`push`、`pop`和`swap`等。我们还模拟实现了`priority_queue`,通过仿函数控制堆的类型,并调用封装容器的接口实现功能。最后,感谢大家的支持与关注。
189 1
|
5月前
|
C++ 容器
【c++丨STL】stack和queue的使用及模拟实现
本文介绍了STL中的两个重要容器适配器:栈(stack)和队列(queue)。容器适配器是在已有容器基础上添加新特性或功能的结构,如栈基于顺序表或链表限制操作实现。文章详细讲解了stack和queue的主要成员函数(empty、size、top/front/back、push/pop、swap),并提供了使用示例和模拟实现代码。通过这些内容,读者可以更好地理解这两种数据结构的工作原理及其实现方法。最后,作者鼓励读者点赞支持。 总结:本文深入浅出地讲解了STL中stack和queue的使用方法及其模拟实现,帮助读者掌握这两种容器适配器的特性和应用场景。
126 21
|
4月前
|
存储 算法 C++
深入浅出 C++ STL:解锁高效编程的秘密武器
C++ 标准模板库(STL)是现代 C++ 的核心部分之一,为开发者提供了丰富的预定义数据结构和算法,极大地提升了编程效率和代码的可读性。理解和掌握 STL 对于 C++ 开发者来说至关重要。以下是对 STL 的详细介绍,涵盖其基础知识、发展历史、核心组件、重要性和学习方法。