【问题标题】:Why do you need two range for loops to change these elements of a vector in C++?为什么需要两个范围 for 循环来更改 C++ 中向量的这些元素?
【发布时间】:2015-04-11 02:00:14
【问题描述】:

对于这个问题:

从 cin 读取一系列单词并将值存储为向量。后 您已经阅读了所有单词,处理了向量并将每个单词更改为 大写。打印转换后的元素,一行八字

这段代码完成了练习:

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

using std::cin;
using std::cout;
using std::endl;
using std::vector;
using std::string;

int main()
{
  vector<string> vec;
  string word;
  while (cin >> word)
    vec.push_back(word);

  for (auto &str : vec)
    for (auto &c : str)
      c = toupper(c);

  for (decltype(vec.size()) i=0; i != vec.size(); ++i)
  {
    if (i!=0&&i%8 == 0) cout << endl;
    cout << vec[i] << " ";
  }
  cout << endl;

  return 0;
}

我只是想知道为什么你必须在这个块中有两个循环范围:

for (auto &str : vec)
        for (auto &c : str)
          c = toupper(c);

...主动将向量的元素更改为大写,而不是这样:

for (auto &str : vec)
      str = toupper(str);

【问题讨论】:

  • Documentation for std::toupper。请注意,除了最底部列出的语言环境之外,没有其他重载。
  • 你可以很容易地定义这样一个对字符串进行操作的函数,只要你不需要比基本的toupper函数更多。主要是,直接使用它只适用于 ASCII 字符。对于一般国际字符支持,您需要使用宽文本,例如std::wstring.

标签: c++ vector


【解决方案1】:

toupper() 转换单个字符,并且没有(标准)变体可以转换字符串中的所有字符。

内部循环导致toupper() 应用于单个string 中的每个字符。外部循环导致内部循环应用于vector&lt;string&gt; 中的每个string

组合效果是将向量中每个字符串中的每个字符都转换为大写。

【讨论】:

    【解决方案2】:

    我只是想知道为什么你必须在这个块中有两个循环范围:

    std::vector&lt;std::string&gt; 类似于strings 的数组。
    std::string 类似于字符数组。

    当您需要将单词转换为全部大写字母时,您需要将单词的每个字符都更改为大写。因此,您需要两个 for 循环。

    你可以使用:

    str = toupper(str);
    

    如果您使用正确的签名实现toupper。标准库没有提供。标准库自带的toupper版本只能转换一个字符。

    【讨论】:

      【解决方案3】:

      toupper() 需要 char 类型的参数,因此您不能直接将 string 放入其中,因为没有转换。

      现在,

      for (auto &str : vec)
            for (auto &c : str)
                 c = toupper(c);
      

      我们必须做上述事情。我可以这样解释:

      1. vec 是一个 vector,因此是一个容器,而这个容器的元素是 stringS。
      2. 您可以将 string 视为 charS 的容器。
      3. 现在在代码的最后一部分,我们按顺序从 string 中取出每个字符,并将其转换为 大写 形式。

      【讨论】:

        猜你喜欢
        • 2015-11-03
        • 1970-01-01
        • 1970-01-01
        • 2019-05-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-01
        相关资源
        最近更新 更多