通过for循环建立索引的最佳方法是哪种?

时间:2019-04-15 18:32:02

标签: c++

我试图对向量内部的值进行乘积运算。这是一大堆代码。.我以前曾发布过,但没有人能提供帮助。我只想确认哪一种是完成其中一部分的正确方法。我目前有:

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)。哪个是实现此目的的正确或最佳方法?如果您希望我可以粘贴所有代码,那么它可以工作,但是我得到的值是错误的。

2 个答案:

答案 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];