C++Primer第五版 第九章习题答案(41~50)

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");
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值