如果要使用 string ,需要添加 string 头文件,即 #include
(注意:string.h 和 string 是不一样的头文件)。
定义 string 的方式跟基本数据类型相同,只需要在 string 后跟上变量名即可。
string str;
如果要初始化,可以直接给 string 类型的变量进行赋值:
string str = “abcd”;
(1)通过下标访问
一般来说,可以直接像字符数组那样去访问 string。
如果要读入和输出整个字符串,则只能用 cin 和 cout 。
那么,如何用 printf 来输出 string 呢? 可以用 c_str() 将 string 类型转换为字符数组进行输出。示例如下:
#include
#include
using namespace std;
int main()
{
string str="abcd";
printf("%s\n", str.c_str());//将string 型str 使用c_str()变为字符数组。
return 0;
}
(2)通过迭代器访问
由于 string 不像其他 STL 容器那样需要参数,因此可以直接如下定义:
string::iterator it;
#include
#include
using namespace std;
int main()
{
string str="abcd";
for (string::iterator it = str.begin(); it != str.end(); it++)
{
printf("%c", *it);
}
return 0;
}
最后指出,string 和 vector 一样,支持直接对迭代器进行加减某个数字,如 str.begin()+3 的写法是可行的。
(1)operator+=
这是 string 的加法,可以将两个 string 直接拼接起来。
#include
#include
using namespace std;
int main()
{
string str1="abcd", str2 = "xyz",str3;
str3 = str1 + str2;
str1 += str2;
cout << str3 << endl;
cout << str1 << endl;
return 0;
}
(2)compare operator
两个 string 类型可以直接使用 ==、!=、<、<=、>、>= 比较大小,比较规则是字典序。
#include
#include
using namespace std;
int main()
{
string str1="aa", str2 = "aaa",str3 = "abc",str4 = "xyz";
if (str1= str3)
{
cout << "ok3" << endl;
}
return 0;
}
(3)length()/size()
length() 返回 string 的长度,即存放的字符数,时间复杂度为 O(1)。size() 与 length() 基本相同。
(4)insert()
string 的 insert() 函数有很多种写法,这里给出几个常用的写法,时间复杂度为O(N)。
1. insert(pos,string),在 pos 号位置插入字符串string。
#include
#include
using namespace std;
int main()
{
string str1="abcdefghij", str2 = "xyz";
str1.insert(3, str2);//在str[3]处插入xyz.
cout << str1<< endl;
return 0;
}
2. insert(it,it2,it3),it 为原字符串的欲插入位置,it2 和 it3 为待插字符串的首尾迭代器,用来表示串 [it2,it3)将被插在 it 的位置上。
#include
#include
using namespace std;
int main()
{
string str1="abcdefghij", str2 = "xyz";
str1.insert(str1.begin()+3,str2.begin(),str2.end());//在str[3]处插入xyz.
cout << str1<< endl;
return 0;
}
(5)erase()
1. 删除单个元素。
str.erase(it) 用于删除单个元素,it 为需要删除的元素的迭代器。时间复杂度为 O(N)。
#include
#include
using namespace std;
int main()
{
string str1="abcdefghij";
str1.erase(str1.begin()+4);
cout << str1<< endl;
return 0;
}
2. 删除一个区间内的所有元素有两种方法:
(1)str.erase(first,last) 即删除 [first,last) 内的所有元素。其中 first 为所需要删除区间的起始迭代器,而 last 则为所需要删除区间的末尾迭代器的下一个地址。时间复杂度为 O(N)。
#include
#include
using namespace std;
int main()
{
string str1="abcdefghij";
str1.erase(str1.begin()+2, str1.begin() + 6);
cout << str1<< endl;
return 0;
}
(2)st.erase(pos,length) ,其中 pos 为需要开始删除的起始位置,length 为删除的字符个数。时间复杂度为 O(N)。
#include
#include
using namespace std;
int main()
{
string str1="abcdefghij";
str1.erase(2, 4);
cout << str1<< endl;
return 0;
}
(6)clear()
clear() 用以清空 string 中的数据,时间复杂度一般为 O(1)。
str.clear()
(7)substr()
substr(pos,len)返回从 pos 号位开始、长度为 len 的子串,时间复杂度为 O(len)。
(8)string::npos
string::npos 是一个常数,其本身的值为 -1,但由于是 unsigned_int 类型,因此实际上也可以认为是 unsigned_int 类型的最大值。string::npos 用以作为 find 函数失配时的返回值。例如在下面的实例中可以认为 string::npos 等于 -1 或者 4294967295.
#include
#include
using namespace std;
int main()
{
if (string::npos==-1)
{
cout << "-1 is true" << endl;
}
if (string::npos == 4294967295)
{
cout << "4294967295 is also true" << endl;
}
return 0;
}
(9)find()
str.find(str2) ,当 str2 是 str 的子串时,返回其在 str 中第一次出现的位置;如果 str2 不是 str 的子串,那么返回 string::npos.
str.find(str2,pos),从 str 的 pos 号位开始匹配 str2,返回值与上相同。
时间复杂度为 O(nm),其中 n 和 m 分别为 str1 和 str2 的长度。
(10)replace()
str.replace(pos,len,str2) 把 str 从 pos 号位开始、长度为 len 的子串替换为 str2.
str.replace(it1,it2,str2) 把 str 的迭代器 [it1,it2)范围的子串替换为 str2.
时间复杂度为 O(str.length())