STL(一)字符串string

引入

在C语言中,一般使用字符数组char str[]来存放字符串,但是操作麻烦,容易出错。
C++ 在 STL 中加入了 string 类型,对字符串常用的需求功能进行了封装,使得操作起来更加方便,且不必担心内存是否足够、字符串的长度等问题。

使用方法

定义与初始化

// string的定义
string str;

// string的初始化
string str = "abc"; // 多个小写字母

赋值

// string的定义
string str;

// string的赋值
str = "123"; // 多个数字字符

输入输出

普通读入

cin 读到空格或换行停止

string str;
cin >> str;  // 字符串读入
cout << str; // 字符串输出

整行读入

getline(),string 的整行输入,回车键之前的内容都会被记录进 string 里

string str;
getline(cin, str); // 整行读入
cout << str; // 字符串输出

整行读入 特殊情况

整行读入的特殊情况:

若题目的输入格式为:给出一个nnn,表示之后有nnn行,每行给定一个带空格的字符串。样例输入:
4
ab cd
hello world
hhh2
zpr zpr

如果直接按照以下代码:

int n;
string s;
cin >> n;
for(int i = 1; i <= n; i++){
    getline(cin, s);
}

会发现只能输入333行字符串,原因是输入444之后,此时按了一下换行,再输入 ab cd。
这一个换行会被第一个getline读进去,因为它是以换行作为分割的,第一个读入的东西是空白的。
正确的写法:

int n;
string s;
cin >> n;
getline(cin, s); // 这句话读入不到任何信息,只是为了吃掉 n 后面的换行 
for(int i = 1; i <= n; i++){
    getline(cin, s);
}

字符串拼接

string 字符串之间能通过 “+” 运算进行拼接

string s1 = "abc", s2 = "def";
string s = s1 + s2;
cout << s << endl;
cout << s.size() << endl; // 获取字符串长度

substr函数

截取字符串的一个子串,substr 包含两个参数,第一个参数是开始截取的下标:start,第二个参数是截取的长度 length(很多同学会认为第二个参数是截取的终点,这是错误的,请终重点记忆)。若不写第二个参数,则截取到字符串尾。
函数内部做了保护,如果长度超过了字符串尾,就到字符串尾为止。

string s = "hello";
s.substr(start, length);

insert函数

在字符串的中间插入一个字符串,t.insert(pos, s)
在字符串的 position 位置前面插入一个字符串 s。其中第一个参数是位置,第二个位置是字符串,表示要被插入的字符串。

string s = "hello", t = "world";
s.insert(2, t);
cout << s << endl;

find函数

查找字符串中是否有某一个子串。若能够找到,则返回这个子串起始位置的下标;若不能,则返回一个特别的标记 s.npos。

int main(){
    string s = "hello", t = "ll";
    if(s.find(t) != s.npos){
        cout << s.find(t);
    }else{
        cout << "t is not exist";
    }
}

reverse 函数

// 翻转字符串   s.begin(): 字符串首地址  s.end(): 字符串尾地址的后一位
string s;
cin >> s;
reverse(s.begin(), s.end())
cout << s << endl;

操作总结与扩展

  1. 以下标的形式访问字符串中的元素:s[i]
  2. 字符串拼接:+
  3. 判断字符串 s 是否为空:s.empty()
  4. 返回字符串 s 中字符个数:s.size()或s.length()
  5. 截取 s 字符串中从 i 开始,长度为 len 的子串:s.substr(i, len)
  6. 在字符串 s 的 pos 的位置前插入一个字符串t:s.insert(pos, t)
  7. 查找在字符串中第一个出现的字符串 t 的位置,查不到返回 4294967295(npos):s.find (t)
  8. 元素翻转:reverse(s.begin(), s.end())
### C++ STL 字符串功能与用法 C++ 的标准模板库(STL)提供了 `std::string` 类型来处理字符串数据结构。相比于传统的 C 风格字符串 (`char*`),`std::string` 提供了许多内置的方法和更安全的操作方式[^3]。 #### 基本概念 `std::string` 是种动态扩展的数据容器,能够存储任意长度的字符序列,并支持许多便捷的操作方法。它属于 `<string>` 头文件的部分,在使用时需包含该头文件: ```cpp #include <string> using namespace std; ``` --- #### 主要功能与方法 以下是 `std::string` 的些常用功能及其对应的例子: 1. **构造与初始化** 可以通过多种方式进行字符串对象的创建: ```cpp string s1; // 默认构造为空字符串 "" string s2("hello"); // 初始化为 "hello" string s3(5, 'a'); // 初始化为 "aaaaa" ``` 2. **访问与修改** - 获取字符串长度:`size()` 或 `length()` - 访问单个字符:`operator[]` 或 `at()` - 修改特定位置字符:直接赋值给索引位置 ```cpp string str = "world"; cout << str.size(); // 输出 5 cout << str[0]; // 输出 'w' str.at(1) = 'o'; // 将第二个字符改为 'o' ``` 3. **拼接与插入** - 拼接两个字符串:`+` 运算符或 `append()` 方法 - 插入子字符串到指定位置:`insert(pos, sub)` 方法 ```cpp string a = "Hello", b = "World"; string result = a + " " + b; // 结果为 "Hello World" string text = "abcdefg"; text.insert(3, "XYZ"); // 在第3位插入 "XYZ" -> "abcXYZdefg" [^1] ``` 4. **删除与替换** - 删除部分字符串:`erase(start_pos, length)` - 替换部分内容:`replace(start_pos, length, new_sub)` ```cpp string data = "abcdefghi"; data.erase(2, 3); // 删除从索引2开始的3个字符 -> "abfghi" data.replace(1, 2, "XY"); // 替换索引1处的2个字符为 "XY" -> "aXZfghi" ``` 5. **查找与比较** - 查找子字符串的位置:`find(sub_string)` - 判断是否相等:`==`, `!=`, `<`, etc. ```cpp string sample = "This is an example."; size_t pos = sample.find("is"); // 找到第个匹配项的位置 -> 2 bool isEqual = (sample == "Test"); // false ``` 6. **转换为其他形式** - 转换为 C 风格字符串:`c_str()` 和 `data()` ```cpp const char *cstr = sample.c_str(); // 返回以 '\0' 结尾的字符数组 ``` 7. **高级操作** - 子字符串提取:`substr(start_index, count)` - 清空字符串内容:`clear()` ```cpp string fullText = "The quick brown fox jumps over the lazy dog."; string part = fullText.substr(4, 5); // 截取从索引4开始的5个字符 -> "quick" fullText.clear(); // 清除全部内容 ``` 8. **KMP 算法实现字符串匹配** 如果需要高效的模式匹配,可以利用 KMP 算法构建 next 数组辅助完成搜索过程[^4]: ```cpp void computeNextArray(const string& pattern, vector<int>& next) { int j = -1; next[0] = -1; for(int i=1;i<pattern.length();i++) { while(j >=0 && pattern[j+1]!=pattern[i]) j = next[j]; if(pattern[j+1]==pattern[i]) ++j; next[i]=j; } } bool kmpSearch(string text, string pattern){ vector<int> next(pattern.length(), -1); computeNextArray(pattern,next); int j=-1; for(int i=0;i<text.length();i++){ while(j>=0&&pattern[j+1]!=text[i]){ j=next[j]; } if(text[i]==pattern[j+1]) j++; if(j==(int)(pattern.length()-1)){ return true; } } return false; } ``` --- ### 总结 上述列举了 C++ STL 中 `std::string` 的主要功能以及其实现细节。这些工具使得开发者能够在程序中高效地管理字符串资源,同时避免手动分配内存带来的风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值