为啥需要两个范围 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 forstd::toupper
。请注意,除了最底部列出的语言环境之外,没有其他重载。
你可以很容易地定义这样一个对字符串进行操作的函数,只要你不需要比基本的toupper
函数更多。主要是,直接使用它只适用于 ASCII 字符。对于一般国际字符支持,您需要使用宽文本,例如std::wstring
.
【参考方案1】:
toupper()
转换单个字符,并且没有(标准)变体可以转换字符串中的所有字符。
内部循环导致toupper()
应用于单个string
中的每个字符。外部循环导致内部循环应用于vector<string>
中的每个string
。
组合效果是将向量中每个字符串中的每个字符都转换为大写。
【讨论】:
【参考方案2】:我只是想知道为什么你必须在这个块中有两个循环范围:
std::vector<std::string>
类似于string
s 的数组。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++ 中向量的这些元素?的主要内容,如果未能解决你的问题,请参考以下文章