41:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void main()
{
vector<char> c{ 'a', 'b', 'c', 'd', 'e' };
string s1(c.begin(),c.end());
cout << s1 << endl;
system("pause");
}
42:用reverse() 操作提前预留好内存,这样就不用在运行过程中进行修改内存操作了。
43:特别注意元素添加或删除后,迭代器的变化。
知识点:
insert(p, t): 在迭代器 p 前插入元素 t ,返回新添加元素的迭代器。 [注] 还有形如:insert(p, n, t)
insert(p, b, e): 在迭代器 p 前插入迭代器 [b, e)范围的元素,返回新添加第一个元素的迭代器。
[注] 还有形如insert(p, n, t): 在 p 前插入 n 个元素 t ;和 insert(p, il): 在 p 前插入元素列表 il 。
erase(p): 删除迭代器 p 所指的元素,返回被删元素的下一元素迭代器。(p 是尾后迭代器,则会报错)。
erase(b, e): 删除迭代器 [b, e) 范围的元素,返回一个指向最后一个被删元素之后元素的迭代器。
#include<iostream>
#include<string>
using namespace std;
void func(string &s, string &oldval, string &newval)
{
string::iterator beg = s.begin();
int old_size = oldval.size(),
new_size = newval.size();
auto b = newval.begin(), //获取替换对象的迭代器
e = newval.end();
while (beg != s.end()-old_size+1)
{
string sample(beg, beg + old_size);
if (sample == oldval)
{
beg = s.erase(beg, beg + old_size);
beg = s.insert(beg, b, e); //需用迭代器表示范围,beg = s.insert(beg, newval);是不可行的,因为newval不是char类型。
beg += old_size;
}
else
++beg;
}
cout << s << endl;
}
void main()
{
string s{ "Y are a good boy!" };
string oldval = "Y";
string newval = "You";
func(s, oldval, newval);
system("pause");
}
输出:
You are a good boy!
请按任意键继续. . .
44:用下标和 replace() 会方便很多:
#include<iostream>
#include<string>
using namespace std;
void func(string &s, string &oldval, string &newval)
{
int old_size = oldval.size();
for (int i = 0; i < s.size() - old_size; ++i)
{
string sample = s.substr(i, old_size); //获取要检测样本
if (sample == oldval)
s.replace(i, old_size, newval);
}
cout << s << endl;
}
void main()
{
string s{ "Y are a good boy!" };
string oldval = "Y";
string newval = "You";
func(s, oldval, newval);
system("pause");
}
输出:
You are a good boy!
请按任意键继续. . .
45:
#include<iostream>
#include<string>
using namespace std;
string func(string s, string &prefix, string &suffix)
{
auto b = s.begin();
b = s.insert(b, prefix.begin(), prefix.end());
s.append(suffix);
return s;
}
void main()
{
string s("golden_moon");
string prefix("Ms.");
string suffix = "III";
cout << func(s, prefix, suffix) << endl;
system("pause");
}
输出:
Ms.golden_moonIII
请按任意键继续. . .
46:
#include<iostream>
#include<string>
using namespace std;
string func(string s, string &prefix, string &suffix)
{
s.insert(0, prefix);
s.insert(s.size(), suffix);
return s;
}
void main()
{
string s("golden_moon");
string prefix("Ms.");
string suffix = "III";
cout << func(s, prefix, suffix) << endl;
system("pause");
}
输出:
Ms.golden_moonIII
请按任意键继续. . .
47:
#include<iostream>
#include<string>
using namespace std;
void main()
{
string name("ab2c3d7R4E6");
string numbers = "0123456789";
string letters{ "abcdRE" };
string::size_type pos = 0;
while ((pos = name.find_first_of(numbers, pos)) != string::npos)
{
cout << "find number: " << name[pos] << " at index: " << pos << endl;
++pos;
}
pos = 0;
while ((pos = name.find_first_not_of(numbers, pos)) != string::npos)
{
cout << "find letter: " << name[pos] << " at index: " << pos << endl;
++pos;
}
system("pause");
}
48:在numbers 中找不到 name,此时返回的值是 string::npos = -1,即:4294967295。(由于npos 是 unsigned 类型)。
49:简易版本的代码:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
void main()
{
string str_bank("abcdefghijklmnopqrstuvwxyz");
string pop_bank("bdfghjklpqty");
string::size_type pos = 0;
while ((pos = str_bank.find_first_not_of(pop_bank,pos))!=string::npos)
{
cout << str_bank[pos];
++pos;
}
cout << endl;
system("pause");
}
50:
#include<iostream>
#include<string>
#include<vector>
using namespace std;
void main()
{
vector<string> in{ "1.1", "2.1", "3.1", "4.1", "5.1" };
int total_int = 0;
double total_double = 0;
for (auto a : in)
{
total_int += stoi(a);
total_double += stod(a);
}
cout << "the total of int is: " << total_int << endl;
cout << "the total of double is: " << total_double << endl;
system("pause");
}