为什么需要两个循环范围来更改C++向量的这些元素

Why do you need two range for loops to change these elements of a vector in C++?

本文关键字:C++ 向量 元素 范围 循环 两个 为什么      更新时间:2023-10-16

对于这个问题:

从 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);

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

内部循环使toupper()应用于单个string中的每个字符。 外部循环使内部循环应用于vector<string>中的每个string

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

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

std::vector<std::string>类似于string数组。
std::string类似于字符数组。

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

您可以使用:

str = toupper(str);

如果使用正确的签名实现toupper。标准库不附带。 标准库附带的toupper版本只能转换一个字符。

toupper() 需要一个 char 类型的参数,因此你不能在其中放置一个直接字符串,因为没有转换。

现在

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

我们需要做上述事情。我可以这样解释:

  1. vec 是一个向量,因此是一个容器,这个容器具有字符串S 的元素。
  2. 您可以将字符串视为字符S 的容器。
  3. 现在在代码的最后一部分,我们按顺序从字符串中获取每个字符,并将其转换为大写形式。