哪个是索引for循环的最佳方法?

问题描述 投票:1回答:2

我试图在向量内的值上做一个产品操作数。这是一堆乱七八糟的代码..我以前发过它但没有人能够提供帮助。我只是想确认哪一个是正确的方法来完成它的一部分。我目前有:

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(索引)更好。这是实现这一目标的正确或最佳方法?如果您愿意我可以粘贴所有代码,它可以工作,但我得到的值是错误的。

c++
2个回答
0
投票

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

  • 基于范围的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) { ... }

你的计算可能涉及doubles或除了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()中的范围检查更快。


0
投票

你有什么好。现代编译器可以优化上述内容,使得代码与访问项目direclty的等效C代码一样快。

我建议使用vector的唯一优化是调用taylorNumerator.reserve(constant)来预先分配所需的存储,而不是在添加新项目时自行调整大小。

关于之后唯一有价值的优化是根本不使用向量而只使用静态数组 - 特别是如果constant足够小以至于它不会炸毁堆栈(或者如果是全局的二进制大小)。

double taylorNumerator[constant];
© www.soinside.com 2019 - 2024. All rights reserved.