C++ String(字符串)

简介

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

注:本文章只列举 string 在 ACM 中的常用操作,如需了解更多有关 string 的内容,请参考 C++官方文档

String 的基本用法

头文件 #include <string>
需要使用 std 命名空间 using namespace std;

注意:如果要读入或者输出整个字符串,一般只能用cin和 cout。如果非要用printf输出string,则需要用c_str()函数将 string转换成字符数组。

cin>>str;
cout<<str<<endl;
printf("%s\n",str.c_str()); //printf输出string

定义 string

定义的方法有很多,在官方文档中例子的基础上修改。

#include <iostream>
#include <string>
using namespace std;

int main ()
{
  std::string s0 ("Initial string");

  std::string s1 =123; //直接赋值
  std::string s2 (s0); //复制字符串
  std::string s3 (s0, 8, 3); //从下标为8的位置开始取3个字符
  std::string s4 ("A character sequence");
  std::string s5 ("Another character sequence", 12); //前12个字符
  std::string s6a (10, 'x'); //10个相同字符
  std::string s6b (10, 42); //42是'*'的ASCII码
  std::string s7 (s0.begin(), s0.begin()+7); //使用迭代器复制区间

  std::cout << "s1: " << s1 << "\ns2: " << s2 << "\ns3: " << s3;
  std::cout << "\ns4: " << s4 << "\ns5: " << s5 << "\ns6a: " << s6a;
  std::cout << "\ns6b: " << s6b << "\ns7: " << s7 << '\n';
  return 0;
}

Output:
s1: 123
s2: Initial string
s3: str
s4: A character sequence
s5: Another char
s6a: xxxxxxxxxx
s6b: **********
s7: Initial

string 中字符的访问

直接访问:

string str;
cout<<str[0];

迭代器访问:

string str="abcdefg";
for(string::iterator it=str.begin()+2; it!=str.end();it++)
{
	printf("%c",*it);//输出cdefg
}

string 运算符

加法运算符:
把两个字符串直接拼接起来。

string str1="abc";
str2="xyz";
str3 = str1 + str2; 
str1 += str2; 
cout << str1 << endl; // abcxyz 
cout << str3 << endl; // abcxyz 

关系运算符:
按照字典序比较两个 string 类型的大小。

string str1="aa";
str2="aaa";
str3="abc";
if(str1 < str2) printf("OK1"); // 输出 OK1 
if(str1 < str3) printf("OK2"); // 输出 OK2

常用函数

  • str.length()str.size() 两种方法返回字符串长度且返回值相等。
  • str.clear() 清空字符串 string。
  • str.substr(pos,len) 取子字符串,返回从 pos 开始长度为 len 的 string。
  • str.insert(it1,it2,it3) 字符串 it1 位置插入 it2 和 it3 之间的内容。
  • str.erase(it_first,it_last) 删除区间内字符(区间左闭右开)。
  • str.erase(pos,len) 区间删除,删除从 pos 开始的 len 个字符。
  • str.find(str2) 查找字符串,找到返回 str2 在 str 中第一次出现的位置,否则返回 string::npos。
  • str.find(str2,pos) 从 str 的 pos 位开始查找 str2,返回值同 str.find(str2)。
  • str.replace(pos,len,str2) 替换,从 pos 位开始、长度为 len 的子串替换为 str2。
  • str.replace(it1,it2,str2) 把 str 的迭代器 it1~it2 范围内(左闭右开)的子串替换为str2。

说明:

  1. string::npos 是一个常数,其本身的值等于-1,但由于是 unsigned int 类型,因此,也可以认为是 unsigned int 类型的最大值。
  2. 上表参数中的 it 为迭代器。

时间复杂度:
O (1):str.length() str.size() str.clear()
O (n):str.insert () str.erase() str.replace() str.substr()
O (n*m):str.find()


相关习题详见: NEFU 大一寒假训练十四(string)2020.02.20

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值