【发布时间】:2019-08-14 01:30:53
【问题描述】:
我的 IDE (CLion) 建议用 foreach 替换 for 循环,其中循环的元素是 char 类型值的地址(选项 2)。我很好奇以下几点:
表达选项 2 中发生的事情的最佳方式是什么?我们是否在 plaintext 中遍历每个字符的内存位置?
选项 2 和 3 有何不同?
选项 3 是否在每次迭代时为新字符分配内存?
选项 1
void Cipher(std::string &plaintext, int key) {
for (int i = 0; i < plaintext.length(); i++) {...}
}
选项 2
void Cipher(std::string &plaintext, int key) {
for (char &letter : plaintext) {...}
}
选项 3
void Cipher(std::string &plaintext, int key) {
for (char letter : plaintext) {...}
}
【问题讨论】:
-
这三个版本都没有指针。
-
reference 是您需要阅读的术语。
-
选项 1,没有。现在是 2019 年。选项 2 仅当
letter的值要在循环中更改时。选项 3 又是可能的。一个有趣的选择是for (const auto &letter : plaintext) {...}。将来更容易过渡到宽字符。 -
我猜选项 3 与前两个不同,因为它在每次迭代时为新字符分配内存。这是正确的吗? 只是有点正确。该角色在自动存储中,因此几乎是免费的。如果编译器认为合适,它可能只是放在寄存器中。
-
选项 1 应该用于您特别需要引用索引的情况(将其传递给另一个数据结构)。它并没有像其他人提到的那样完全过时。
标签: c++ pointers foreach function-pointers