C++string类常见接口函数原型与使用
作者:互联网
string类
一、什么是string类?
在C语言中,我们要定义使用char*来定义和操作字符串,但是一般这种情况下字符串的大小都是固定的,动态重新开辟空间也较为麻烦。更改字符串也不方便,需要自己手动写好多函数接口来实现不同的功能。为了改变这一情况,C++使用了string类来进行字符串操作,所有与字符串相关的函数都封装在string类中,我们只需要调用相关接口进行操作就行了。并且在对字符串添加新的内容时,我们也不用自己去动态开辟新的空间,string类会自动检测,如果空间不够,自己开辟新的空间,并将原空间的内容拷贝到新空间去。
二、类的各个接口
构造函数
这就是string类的构造函数,我们看到一共有7个构造函数,分别支持各种类型。包括无参构造,指定字符串构造,拷贝构造,迭代器构造等。
#include <iostream>
#include <string>
int main ()
{
std::string s0 ("Initial string");
// constructors used in the same order as described above:
std::string s1;
std::string s2 (s0);
std::string s3 (s0, 8, 3);
std::string s4 ("A character sequence");
std::string s5 ("Another character sequence", 12);
std::string s6a (10, 'x');
std::string s6b (10, 42); // 42 is the ASCII code for '*'
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;
}
运算符重载
=运算符重载
C++定义了三个’='运算符中重载函数来供用户使用,作用和其他内置类型一样,将=右边的内容放到到左边所提供的空间里
#include <iostream>
#include <string>
int main ()
{
std::string str1, str2, str3;
str1 = "Test string: "; // c-string
str2 = 'x'; // single character
str3 = str1 + str2; // string
std::cout << str3 << '\n';
return 0;
}
[]运算符重载
我们在使用C语言是会使用[]运算符来对字符串的某个元素进行解引用,但是C++的string是一个类,而不是普通的字符串,所以为了使用方便C++重载了[]运算符。
两个重载函数,一个用于const函数调用,一个用于普通函数调用,使用方法与C语言保持一致。
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for (int i=0; i<str.length(); ++i)
{
std::cout << str[i];
}
return 0;
}
+=运算符重载
在对字符串进行增加内容时,这个运算符用的是最多的,因为一目了然,用着也符合人的习惯。
与=运算符一样,有三个重载函数,分别支持string类,字符串与单个字符的操作。
#include <iostream>
#include <string>
int main ()
{
std::string name ("John");
std::string family ("Smith");
name += " K. "; // c-string
name += family; // string
name += '\n'; // character
std::cout << name;
return 0;
}
+运算符重载
既然都有+=,那肯定就有+运算符重载了。+=会改变左操作数,而+不会。
#include <iostream>
#include <string>
main ()
{
std::string firstlevel ("com");
std::string secondlevel ("cplusplus");
std::string scheme ("http://");
std::string hostname;
std::string url;
hostname = "www." + secondlevel + '.' + firstlevel;
url = scheme + hostname;
std::cout << url << '\n';
return 0;
}
>>运算符重载
为了实现对字符串的输入,C++重载了>>运算符
值的注意的是,该输入与scanf输入一样,不可以接受空格与换行字符。
#include <iostream>
#include <string>
main ()
{
std::string name;
std::cout << "Please, enter your name: ";
std::cin >> name;
std::cout << "Hello, " << name << "!\n";
return 0;
}
<<运算符重载
重载<<运算符,就可以像输出字符串一样输出string类了。
#include <iostream>
#include <string>
main ()
{
std::string str = "Hello world!";
std::cout << str << '\n';
return 0;
}
迭代器接口
begin()与end()
使用迭代器可以遍历字符串,也可以对对字符串进行修改
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
for ( std::string::iterator it=str.begin(); it!=str.end(); ++it)
std::cout << *it;
std::cout << '\n';
return 0;
}
rbegin()与rend()
这个是反向迭代器,正向迭代器可以对字符串进行正向遍历,反向字符串就可以对字符串进行反向遍历。
#include <iostream>
#include <string>
int main ()
{
std::string str ("now step live...");
for (std::string::reverse_iterator rit=str.rbegin(); rit!=str.rend(); ++rit)
std::cout << *rit;
return 0;
}
增删查改接口
push_back()尾插
对字符串进行尾插操作
#include <iostream>
#include <fstream>
#include <string>
int main ()
{
std::string str;
std::ifstream file ("test.txt",std::ios::in);
if (file) {
while (!file.eof()) str.push_back(file.get());
}
std::cout << str << '\n';
return 0;
}
append()追加
在原字符串后面加上字符串或若干字符
#include <iostream>
#include <string>
int main ()
{
std::string str;
std::string str2="Writing ";
std::string str3="print 10 and then 5 more";
// used in the same order as described above:
str.append(str2); // "Writing "
str.append(str3,6,3); // "10 "
str.append("dots are cool",5); // "dots "
str.append("here: "); // "here: "
str.append(10u,'.'); // ".........."
str.append(str3.begin()+8,str3.end()); // " and then 5 more"
str.append<int>(5,0x2E); // "....."
std::cout << str << '\n';
return 0;
}
insert()指定位置添加
可以看到这里不仅可以通过下标指定位置添加,也可以通过迭代器指定位置;不仅可以添加字符串,也可以添加单个字符,就是push_back()与append()函数的集合。
#include <iostream>
#include <string>
int main ()
{
std::string str="to be question";
std::string str2="the ";
std::string str3="or not to be";
std::string::iterator it;
// used in the same order as described above:
str.insert(6,str2); // to be (the )question
str.insert(6,str3,3,4); // to be (not )the question
str.insert(10,"that is cool",8); // to be not (that is )the question
str.insert(10,"to be "); // to be not (to be )that is the question
str.insert(15,1,':'); // to be not to be(:) that is the question
it = str.insert(str.begin()+5,','); // to be(,) not to be: that is the question
str.insert (str.end(),3,'.'); // to be, not to be: that is the question(...)
str.insert (it+2,str3.begin(),str3.begin()+3); // (or )
std::cout << str << '\n';
return 0;
}
erease()
删除指定位置n个字符
npos其实就是size_t的最大值,标识如果不传入要删除多少个字符,则删除所有字符
#include <iostream>
#include <string>
int main ()
{
std::string str ("This is an example sentence.");
std::cout << str << '\n';
// "This is an example sentence."
str.erase (10,8); // ^^^^^^^^
std::cout << str << '\n';
// "This is an sentence."
str.erase (str.begin()+9); // ^
std::cout << str << '\n';
// "This is a sentence."
str.erase (str.begin()+5, str.end()-9); // ^^^^^
std::cout << str << '\n';
// "This sentence."
return 0;
}
size()
返回当前字符串的有效字符个数
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "The size of str is " << str.size() << " bytes.\n";
return 0;
}
capacity()
返回当前字符串的空间大小,字符串在进行空间开辟时不会只增加要添加字符的个数个空间,而是在原有空间的基础上增加1.5倍或2倍(不同版本不一致)。所以当前字符串的有效字符个数不一定等于总空间大小。
#include <iostream>
#include <string>
int main ()
{
std::string str ("Test string");
std::cout << "size: " << str.size() << "\n";
std::cout << "length: " << str.length() << "\n";
std::cout << "capacity: " << str.capacity() << "\n";
std::cout << "max_size: " << str.max_size() << "\n";
return 0;
}
rsize()
重新定义字符串有效字符个数,可指定字符来填充
#include <iostream>
#include <string>
int main ()
{
std::string str ("I like to code in C");
std::cout << str << '\n';
unsigned sz = str.size();
str.resize (sz+2,'+');
std::cout << str << '\n';
str.resize (14);
std::cout << str << '\n';
return 0;
}
reserve()
指定字符串大小为n,在定义一个新的string对象时,如果我们知道这个对象要用多大空间,就可以使用reserve()函数来开辟空间。从而避免在使用时多次开辟空间而导致效率低下。值得一提的是改函数只可以把空间扩大,而不可以缩小空间。
#include <iostream>
#include <fstream>
#include <string>
int main ()
{
std::string str;
std::ifstream file ("test.txt",std::ios::in|std::ios::ate);
if (file) {
std::ifstream::streampos filesize = file.tellg();
str.reserve(filesize);
file.seekg(0);
while (!file.eof())
{
str += file.get();
}
std::cout << str;
}
return 0;
}
find()
在字符串中正向查找指定字符或字符串
找到则返回对应位置,找不到返回npos
#include <iostream> // std::cout
#include <string> // std::string
int main ()
{
std::string str ("There are two needles in this haystack with needles.");
std::string str2 ("needle");
// different member versions of find in the same order as above:
std::size_t found = str.find(str2);
if (found!=std::string::npos)
std::cout << "first 'needle' found at: " << found << '\n';
found=str.find("needles are small",found+1,6);
if (found!=std::string::npos)
std::cout << "second 'needle' found at: " << found << '\n';
found=str.find("haystack");
if (found!=std::string::npos)
std::cout << "'haystack' also found at: " << found << '\n';
found=str.find('.');
if (found!=std::string::npos)
std::cout << "Period found at: " << found << '\n';
// let's replace the first needle:
str.replace(str.find(str2),str2.length(),"preposition");
std::cout << str << '\n';
return 0;
}
rfind()
在字符串中逆向查找指定字符或字符串
#include <iostream>
#include <string>
#include <cstddef>
int main ()
{
std::string str ("The sixth sick sheik's sixth sheep's sick.");
std::string key ("sixth");
std::size_t found = str.rfind(key);
if (found!=std::string::npos)
str.replace (found,key.length(),"seventh");
std::cout << str << '\n';
return 0;
}
标签:std,string,C++,运算符,str,字符串,include,接口函数 来源: https://blog.csdn.net/qq_43647942/article/details/115376905