《C++标准模板库实战》的第二章看完了。习题操练,用的c++14编译的。
一,P87 习题2
可以从键盘读取任意个数的城市名称,然后以std::string对象的形式把它们存放到vector<T>容器中。以升序的形式对城市名排序,并且每行几个地列出它们,每个一个字段的长度固定,可以适应最长的城市名。按他们的开头字母分组输出,每组之间用一个空行隔开。
二,没找到参考答案,我的code如下。
备份下等熟练c++11后再回头看,肯定可以再优化的。
#include <iostream> // For standard streams
#include <algorithm> // For copy()
#include <string> // For string classes
#include <iterator> // For front_insert_iterator & stream iterators
#include <vector>
#include <iomanip>
using std::string;
//自定义升序排序函数
bool sortFun(string p1, const string p2)
{
return p1 < p2;
}
int main()
{
std::vector<string> names;
// cin输入,按顺序放入向量
std::cout << "Enter first names separated by spaces. Enter Ctrl+Z on a new line to end:\n";
std::copy(std::istream_iterator < string > {std::cin}, std::istream_iterator < string > {}, std::back_inserter(names));
std::cout << "\nIn reverse order, the names you entered are:\n";
// 升序排序
sort(names.begin(), names.end(), sortFun);
// 获取最大城市长度
uint8_t maxlen=0;
for(auto item:names)
{
if(item.length()>maxlen)
{
maxlen=item.length();
}
}
// 输出
std::cout <<"after sort:"<< std::endl;
char old='a';
for(auto item:names)
{
if(item.at(0)==old)
{
}
else
{
// 头字母不同则换行
std::cout <<std::endl;
}
// 设置长度对齐
std::cout <<std::left<<std::setw(maxlen)<<item;
old=item.at(0);
}
return 0;
}
三,运行结果
Enter first names separated by spaces. Enter Ctrl+Z on a new line to end:
Tianjing Hebei Henan Taibei Beijing Shanghai
^Z
In reverse order, the names you entered are:
after sort:
Beijing
Hebei Henan
Shanghai
Taibei Tianjing