我试图对向量内部的值进行乘积运算。这是一大堆代码。.我以前曾发布过,但没有人能提供帮助。我只想确认哪一种是完成其中一部分的正确方法。我目前有:
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)。哪个是实现此目的的正确或最佳方法?如果您希望我可以粘贴所有代码,那么它可以工作,但是我得到的值是错误的。
答案 0 :(得分: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)可能比{{1 }}。
int
您的计算可能处理for (std::size_t i = 0; i != taylorNumerators.size(); ++i) { ... }
或double
以外的某种数值类型,因此您必须考虑转换它的最佳方法。许多程序员将依赖于隐式转换,但这可能很危险,除非您非常了解转换规则。我通常会先将索引静态转换为实际需要的类型。例如:
std::size_t
在C ++中,确保索引在范围内然后使用for (std::size_t i = 0; i != taylorNumerators.size(); ++i) {
const auto x = static_cast<double>(i);
/* calculation involving x */
}
而不是使用operator[]
可能更常见。许多项目都禁用了例外,因此at()
的安全性保证实际上将不可用。而且,如果您可以自己检查一次范围,那么使用at()
会比依赖于每个索引操作内置于operator[]
的范围检查更快。
答案 1 :(得分:0)
您所拥有的很好。现代编译器可以优化上述内容,使代码与访问项目直接性的等效C代码一样快。
我建议使用vector
的唯一优化方法是调用taylorNumerator.reserve(constant)
来分配所需的存储空间,而不是在添加新项目时进行向量大小调整。
关于此后唯一值得进行的优化是根本不使用向量,而仅使用静态数组-特别是如果constant
足够小以至于不会炸毁堆栈(或者全局大小则为二进制大小)
double taylorNumerator[constant];