對於字符串string的額外操作
s.substr(pos,n) 返回一個string包含從pos開始的n個字符串的拷貝。pos默認爲0. n的默認值爲s.size()-pos,就是拷貝從pos開始的所有字符 const char *cp = "Hello world!!!!"; char noNuLL[] = { 'H', 'i' }; string s1(cp); string s2(noNuLL, 2); string s3(noNuLL);//錯誤字符串需要以/0爲結束符 string s4(cp + 6, 5); string s5(s1, 6, 5); string p("Helo World!!!"); string p2 = p.substr(0, 5); string p3 = p.substr(5); string p4 = p.substr(6, 11); cout << p << endl; cout << p2 << endl; cout << p3 << endl; cout << p4 << endl;
字符串操作 含義 s.insert(pos,args) pos可以是下標或者迭代器,或者說所有線性存儲容器都支持下標設置 s.erase(pos,len) 刪除pos位置上長度爲len個字符 s.append(args) 在s末尾添加args然後返回一個s的引用 s.assign(args) 這是一個替換函數。用args替換s中的字符串 s.replace(range,args) 刪除s中範圍range內的字符並且用args替換
#include<iostream>
#include<string>
#include <vector>
using namespace std;
void replace_string(string&s, const string &oldVal, const string &newVal)
{
auto l = oldVal.size();
if (!l)
return;//表示要查找的字符串爲空
auto iter = s.begin();
while (iter <= s.end() - 1)
{
auto iter1 = iter;
auto iter2 = oldVal.begin();
while (iter2 != oldVal.end() && *iter1 == *iter2)
{
iter1++;
iter2++;
}
if (iter2 == oldVal.end())
{
iter = s.erase(iter, iter1);//由後至前逐個插入
if (newVal.size())
{
iter2 = newVal.end();
do
{
iter2--;
iter2 = s.insert(iter, *iter2);
} while (iter2 > newVal.begin());
}
iter += newVal.size();
}
else
iter++;
}
}
int main(int argc, char **argv)
{
//////////////////////////////////////////////////////////////////////////
//string操作
const char *cp = "Hello world!!!!";
char noNuLL[] = { 'H', 'i' };
string s1(cp);
string s2(noNuLL, 2);
string s3(noNuLL);//錯誤字符串需要以/0爲結束符
string s4(cp + 6, 5);
string s5(s1, 6, 5);
string p("Helo World!!!");
string p2 = p.substr(0, 5);
string p3 = p.substr(5);
string p4 = p.substr(6, 11);
cout << p << endl;
cout << p2 << endl;
cout << p3 << endl;
cout << p4 << endl;
//string p5 = p.substr(16);//字符串數組越界,拋出異常
//////////////////////////////////////////////////////////////////////////
//9.41
vector<char>vc{ 'g', 'f', 's', 'b', 'a' };
string s(vc.data(), vc.size());
cout << s<<endl;
void input_string(string&s);
system("pause");
}
//////////////////////////////////////////////////////////////////////////
//高效的處理動態增長的string
//在聲明的過程中就直接定義了嗎?應該是的,雖然定義與實現要分離但是這樣會浪費大量的新建文件的時間,這時候小型文本編輯器就顯得很重要了,而不會選擇如此臃腫的vs2013
void input_string(string&s)
{
s.reserve(100);
char c;
while (cin >> c)
s.push_back(c);
}