为啥需要两个范围 for 循环来更改 C++ 中向量的这些元素?

Posted

技术标签:

【中文标题】为啥需要两个范围 for 循环来更改 C++ 中向量的这些元素?【英文标题】: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. 【参考方案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);

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

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

【讨论】:

以上是关于为啥需要两个范围 for 循环来更改 C++ 中向量的这些元素?的主要内容,如果未能解决你的问题,请参考以下文章

C++基于范围的for循环详解

C++ 循环for 引用 for(string & : )

为啥基于范围的 for 循环不修改容器元素?

C++范围for

为啥 C 和 C++ for 循环使用 int 而不是 unsigned int?

C++中“for”循环的范围规则与C中不同? [复制]