C++

c++STL使用序列容器--Apple的学习笔记

2019-10-22  本文已影响0人  applecai

《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

上一篇下一篇

猜你喜欢

热点阅读