string类可以实现多个构造函数的重载,下列是常见构造函数使用事例。
string s1; //构造一个空的字符串。
string s2("hello"); //编译器经过优化后利用字符串直接对s2进行构造
string s3(100, 'x'); //对s3构造n个字符。
string s4("hello", 2); //从字符串的位置和个数对s4进行构造。
string s5(s4, 1, 3); //对string s4指定位置和字符个数对s5进行初始化。
size 返回字符串有效字符长度
length 返回字符串有效字符长度
capacity 返回空间总大小
empty 检测字符串释放为空串,是返回true,否则返回false
clear 清空有效字符
reserve 为字符串预留空间,防止频繁扩容,降 低效率
resize 将有效字符的个数该成n个,多出的空间用字符c填充
1:string类对operator[]进行重载,并且因为该重载为引用返回,我们可以通过下标[]进行访问修改下标所对应的元素。
void Teststring()
{
string s("hello");
string s1("hello CSDN");
for (size_t i = 0; i < s.size(); ++i)
{
cout << s[i] << endl; //对s1进行访问。
}
for (size_t i = 0; i < s.size(); ++i)
{
s1[i] = 'x'; //对s1进行访问修改;
}
cout << s1 << endl;
}
}
2:使用范围for访问类对象
范围for的底层其实就是迭代器(类似指针遍历),它能自动迭代,自动判断结束,常用来遍历数组等数据结构。当我们使用范围for修改对象时,要取对象s的引用进行修改。
using namespace std;
void Teststring()
{
string s("hello");
for (auto ch : s) //依次将类s中的每个元素赋值给变量ch后进行访问。
{
cout << ch << ' ';//输出;
}
for (auto& ch : s) //取自动迭代对s进行赋值访问;
{
ch = 'x';
}
cout << s << endl;
}
int main()
{
Teststring();
return 0;
}
3:使用迭代器进行访问
void Teststring()
{
string s("111");
string::iterator it = s.begin();//字符串的指向第一个位置的指针赋值给迭代器it;
while (it != s.end()) //it不能等于字符串指向最后一个位置的下一个位置的地址
{
cout << *it << endl;
++it;
}
it = s.begin(); //重新对it进行赋值。
while (it != s.end()) //使用it进行访问并进行修改。
{
*it+= 1;
it++;
}
cout << s << endl; //输出222;
}
1:使用push_back进行尾插
void Teststring()
{
string s("hello");
s.push_back('1');
cout << s << endl;
}
2:使用append函数在字符串后面追加一个字符串。
void Teststring()
{
string s("hello");
s.append(" CSDN");
cout << s << endl;
}
3:使用insert指定位置和字符串插入string类中。
void Teststring()
{
string str("can you see?");
for (size_t i = 0; i < str.size(); i++)
{
if (str[i] == ' ')
{
str.insert(i, "20%"); //在string空格处插入字符串;
// i += 3;//void Teststring()
{
string str("can you see?");
for (size_t i = 0; i < str.size(); i++)
{
if (str[i] == ' ')
{
str.insert(i, "20%"); //在string空格处插入字符串;
i += 3;
}
}
cout << str << endl;
}
注意: 插入字符串时,’ ‘处也会发生后移,如果 不执行代码 i += 3;以及循环内 i++,跳过后移过的’’ '时,程序会一直在第一个‘ ’插入20%,一直后移,导致程序崩溃。
1:使用erase函数指定位置和个数进行删除。
void Teststring()
{
string s("hello");
s.erase(2);
cout << s << endl;
}
2:使用pop_back进行尾删
void Teststring()
{
string s("hello");
s.pop_back();
cout << s << endl;
}
1:find ,指从字符串pos位置开始往后找字符C,并返回该字符的位置。
void Teststring()
{
string url1 = "http://www.cplusplus.com/reference/string/string/find/";
size_t pos1 = url1.find("://");
if (pos1 == string::npos) //npos 为类string的静态成员变量;
{
cout << " fin url1 false" << endl;
return;
}
cout << pos1 << endl;
}
int main()
{
Teststring();
}
2:rfind从字符串的右侧开始匹配对应字符C,并返回该字符的位置。如果指定位置,便会从指定位置开始查找,否则便会从字符串的首位置查找。
using namespace std;
void Teststring()
{
string url1 = "http://www.cplusplus.com/reference/string/string/find/";
size_t pos1 = url1. rfind("://");
if (pos1 == string::npos) //npos 为类string的静态成员变量;
{
cout << " fin url1 false" << endl;
return;
}
cout << pos1 << endl; //输出的位置下标与rfind一样不变,只是寻找的方向变化了。
}
substr函数可以指定目标子字符串的首位置,以及首位置到目标尾位置之间的字符个数来提取子字符串。
using namespace std;
void Teststring()
{
string url1 = "http://www.cplusplus.com/reference/string/string/find/";
size_t pos1 = url1. rfind("://");
if (pos1 == string::npos) //npos 为类string的静态成员变量;
{
cout << " fin url1 false" << endl;
return;
}
size_t pos2 = url1.find('/',pos1 +3); //注意从pos + 3的位置后一个字符一个字符的查找。
if (pos2 == string::npos)
{
cout << " fin url1 false" << endl;
return;
}
//提取域名;
string url2=url1.substr(pos1 + 3, pos2-pos1-3);
cout << url2 << endl;
}
1:string类进行了操作符重载,可以对strng类 类型进行赋值(=),追加字符串(+=)。但不包含删除(-=)。
2:<< 和 >>对于string类 类型也同样适用。
void Teststring()
{
string str(" hello CSDN");
str += "1234"; //向str字符串尾部追加"1234"
cout << str << endl;
str = "xxxx"; //对字符串str直接赋值。
cout << str << endl;
}
当我们用>>输入字符串时,当编译器读取空格或者’\n’时会结束当前输入。为了避免这一状况,我们可以采用getline函数,此时便可以将空格输入到string str对象中。
using namespace std;
void Teststring()
{
string str;
getline(cin, str);
size_t pos = str.find(' ');
if (pos != string::npos)
{
cout << str.size() - 1 - pos << endl;
return;
}
}