C++Primer练习与答案——3.3.3节

练习:

3.16:编写一段程序,把练习3.13中vector对象的容量和具体内容输出出来。检验你之前的回答是否正确,如果不对,回过头重新学习3.3.1节直到弄明白错在何处为止。

【解答】:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main()
{
  vector<int> v1;
  vector<int> v2(10);
  vector<int> v3(10,42);
  vector<int> v4{10};
  vector<int> v5{10, 42};
  vector<string> v6{10};
  vector<string> v7{10, "hi"};

  cout << "v1的元素个数是:" << v1.size() << endl;
  if(v1.size() >  0)      // 当vector含有元素时逐个输出
  {
      cout << "v1的元素分别是:" << endl;
      for(auto e : v1)    // 使用范围for语句遍历每一个元素
          cout << e << " ";
      cout << endl;
  }

  cout << "v2的元素个数是:" << v2.size() <<  endl;
  if(v2.size() > 0)       // 当vector含有元素时逐个输出
  {
      cout << "v2的元素分别是:" << endl;
      for(auto e : v2)    // 使用范围for语句遍历每一个元素
        cout << e << " ";
      cout << endl;
  }

  cout << "v3的元素个数是:" << v3.size() << endl;
  if(v3.size() > 0)       // 当vector含有元素时逐个输出
  {
      cout << "v3的元素分别是:" << endl;
      for(auto e : v3)    // 使用范围for语句遍历每一个元素
        cout << e << " ";
      cout << endl;
  }

  cout << "v4的元素个数是:" << v4.size() << endl;
  if(v4.size() > 0)       // 当vector含有元素时逐个输出
  {
      cout << "v4的元素分别是:" << endl;
      for(auto e : v4)    // 使用范围for语句遍历每一个元素
          cout << e << " ";
      cout << endl;
  }

  cout << "v5的元素个数是:" << v5.size() << endl;
  if(v5.size() > 0)       // 当vector含有元素时逐个输出
  {
      cout << "v5的元素分别是:" << endl;
      for(auto e : v5)    // 使用范围for语句遍历每一个元素
          cout << e << " ";
      cout << endl;
  }

  cout << "v6的元素个数是:" << v6.size() << endl;
  if(v6.size() > 0)       // 当vector含有元素时逐个输出
  {
      cout << "v6的元素分别是:" << endl;
      for(auto e : v6)    // 使用范围for语句遍历每一个元素
          cout << e << " ";
      cout << endl;
  }

  cout << "v7的元素个数是:" << v7.size() << endl;
  if(v7.size() > 0)       // 当vector含有元素时逐个输出
  {
      cout << "v7的元素分别是:" << endl;
      for(auto e : v7)    // 使用范围for语句遍历每一个元素
          cout << e << " ";
      cout << endl;
  }

  return 0;
}

3.17:从cin读入一组词并把它们存入一个vector对象,然后设法把所有词都改写为大写形式。输出改变后的结果,每个词占一行。

【解答】:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

int main()
{
    vector<string> vString;     // 元素类型为string的vector对象
    string s;                   // 记录用户的输入值
    char cont = 'y';            // 与用户交互,决定是否继续输入
    cout << "请输入第一个词:" << endl;
    while(cin >> s)
    {
        vString.push_back(s);   // 向vector对象中添加元素
        cout << "您要继续吗(y or n)?" << endl;
        cin >> cont;
        if(cont !='y' && cont != 'Y')
            break;
        cout << "请输入下一个词:" << endl;
    }
    cout << "转换后的结果是:" << endl;
    for(auto &mem : vString)    // 使用范围for循环语句遍历vString中的每个元素
    {
        for(auto &c : mem)      // 使用范围for循环语句遍历mem中的每个字符
            c = toupper(c);     // 改写为大写字母形式
        cout << mem << endl;
    }

    return 0;
}

3.18:下面的程序合法吗?如果不合法,你准备如何修改?
    vector<int> ivec;
    ivec[0] = 42;

【解答】:

该程序是非法的,因为ivec目前没有任何元素,因此ivec[0]的形式是错误的,程序试图访问的元素根本不存在。要想向vector对象中添加新元素,需要使用push_back函数。
下面是修改后的程序代码:
    vector<int> ivec;
    ivec.push_back(42);

3.19:如果想定义一个含有10个元素的vector对象,所有元素的值都是42,请列举三种不同的实现方法。哪种方法更好?为什么?

【解答】:

解决思路一:先定义一个空vector对象,然后添加元素
    vector<int> vInt;
    for(int i = 0; i < 10; i++)
        vInt.push_back(42);
解决思路二:列表初始化,罗列出全部10个元素的值。
    vector<int> vInt = {42,42,42,42,42,42,42,42,42,42};
解决思路三:用括号给出所有元素的值,效果类似于解决思路二。
    vector<int> vInt{42,42,42,42,42,42,42,42,42,42};
解决思路四:定义的时候使用参数指定元素个数及重复的值。
    vector<int> vInt(10, 42);
解决思路五:先指定元素个数,再利用范围for循环依次为元素赋值。
    vector<int> vInt(10);
    for(auto &i : vInt)
        i = 42;
显然,思路四采用的初始化方式形式上最简洁直观,当vector对象的元素数量较多且取值重复时是最好的选择:而思路一在开始的时候不限定元素的个数,比较灵活。

3.20:读入一组整数并把它们存入一个vector对象,将每对相邻整数的和输出出来。改写你的程序,这次要求先输出第一个和最后1个元素的和,接着输出第2个和倒数第2个元素的和,以此类推。

【解答】:

// 求相邻元素和的程序如下所示
#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> vInt;
  int iVal;
  cout << "请输入一组数字:" << endl;
  while (cin >> iVal)
    vInt.push_back(iVal);
  if (vInt.size() == 0) {
    cout << "没有任何元素" << endl;
    return -1;
  }
  cout << "相邻两项的和依次是:" << endl;
  // 利用decltype判断i的类型
  for (decltype(vInt.size()) i = 0; i < vInt.size() - 1; i += 2) {
    // 求相邻两项的和
    cout << vInt[i] + vInt[i + 1] << " ";
    // 每行输出5个数字
    if ((i + 2) % 10 == 0)
      cout << endl;
  }
  // 如果元素数是奇数,单独处理最后一个元素
  if (vInt.size() % 2 != 0)
    cout << vInt[vInt.size() - 1];

  return 0;
}
#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> vInt;
  int iVal;
  cout << "请输入一组数字:" << endl;
  while (cin >> iVal)
    vInt.push_back(iVal);
  if (vInt.size() == 0) {
    cout << "没有任何元素" << endl;
    return -1;
  }
  cout << "首尾两项的和依次是:" << endl;
  // 利用decltype判断i的类型
  for (decltype(vInt.size()) i = 0; i < vInt.size() / 2; i++) {
    // 求相邻两项的和
    cout << vInt[i] + vInt[vInt.size() - i - 1] << " ";
    // 每行输出5个数字
    if ((i + 1) % 5 == 0)
      cout << endl;
  }
  // 如果元素数是奇数,单独处理最后一个元素
  if (vInt.size() % 2 != 0)
    cout << vInt[vInt.size() / 2];
  return 0;
}

版权声明:本文为McKenzie原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。