哪个是索引for循环的最佳方法?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了哪个是索引for循环的最佳方法?相关的知识,希望对你有一定的参考价值。
我试图在向量内的值上做一个产品操作数。这是一堆乱七八糟的代码..我以前发过它但没有人能够提供帮助。我只是想确认哪一个是正确的方法来完成它的一部分。我目前有:
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(索引)更好。这是实现这一目标的正确或最佳方法?如果您愿意我可以粘贴所有代码,它可以工作,但我得到的值是错误的。
如果可能,您应该完全避免使用索引。你的选择是:
- 基于范围的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()
中的范围检查更快。
你有什么好。现代编译器可以优化上述内容,使得代码与访问项目direclty的等效C代码一样快。
我建议使用vector
的唯一优化是调用taylorNumerator.reserve(constant)
来预先分配所需的存储,而不是在添加新项目时自行调整大小。
关于之后唯一有价值的优化是根本不使用向量而只使用静态数组 - 特别是如果constant
足够小以至于它不会炸毁堆栈(或者如果是全局的二进制大小)。
double taylorNumerator[constant];
以上是关于哪个是索引for循环的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章