gpt4 book ai didi

c++ - 通过 for 循环索引的最佳方法是什么?

转载 作者:太空宇宙 更新时间:2023-11-04 12:37:36 25 4
gpt4 key购买 nike

我正在尝试对 vector 内部的值执行乘积操作数。这是一堆乱七八糟的代码。我之前已经发布过它,但没有人能够提供帮助。我只想确认哪个是完成其中一部分的正确方法。我目前有:

vector<double> taylorNumerator;
for(a = 0; a <= (constant); a++) {
double Number = equation involving a to get numerous values;
taylorNumerator.push_back(Number);
for(b = 0; b <= (constant); b++) {
double NewNumber *= taylorNumerator[b];
}

这是我的快照,与我实际拥有的相差甚远。有人告诉我最好改用 vector.at(index) 。哪个是完成此任务的正确或最佳方法?如果您愿意,我可以粘贴所有代码,它可以工作,但我得到的值是错误的。

最佳答案

如果可能,您应该完全避免使用索引。您的选择是:

  • 基于范围的 for 循环:

    for (auto numerator : taylorNumerators) { ... }
  • 基于迭代器的循环:

    for (auto it = taylorNumerators.begin(); it != taylorNuemrators.end(); ++it) { ... }
  • 一个标准算法,可能带有 lambda:

    #include <algorithm>

    std::for_each(taylorNumerators, [&](double numerator) { ... });

    请特别注意,某些算法允许您指定迭代次数,例如 std::generate_n ,因此您可以创建正好 n 个项目,而无需自己计算到 n 个。

如果您需要计算中的索引,那么使用传统的for循环是合适的。您必须注意几个陷阱:std::vector<T>::size()返回 std::vector<T>::size_type这通常与 std::size_type 相同,这是 (1) 无符号且 (2) 很可能大于 int .

for (std::size_t i = 0; i != taylorNumerators.size(); ++i) { ... }

您的计算可能涉及 double s 或除 std::size_t 以外的一些数字类型,所以你必须考虑转换它的最佳方式。许多程序员会依赖隐式转换,但除非您非常了解转换规则,否则这可能很危险。我通常首先将索引静态转换为我实际需要的类型。例如:

for (std::size_t i = 0; i != taylorNumerators.size(); ++i) {
const auto x = static_cast<double>(i);
/* calculation involving x */
}

在 C++ 中,确保索引在范围内然后使用 operator[] 可能更为常见。而不是使用 at() .很多项目禁用异常,所以at()的安全保证不会真的可用。而且,如果您可以自己检查一次范围,那么使用 operator[] 会更快而不是依赖 at() 内置的范围检查在每个索引操作上。

关于c++ - 通过 for 循环索引的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55695303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com