0

我最近去面试一个程序工作,他们让我写一些函数,它将一个向量和一个整数作为参数。任务是计算向量中大于、小于或等于整数的元素数量。我沿着这些思路写了一些东西:

void printStat(const std::vector<int> &vec, const int &val)
{
    int results[3] = {0,0,0};
    for (int i = 0; i < vec.size(); ++i) {
        int option = (vec[i] == val) ? 0 : ((vec[i] > val) ? 1 : 2);
        results[option]++;
    }
    ...
}

他们对我认为可疑的代码发表了一些评论,我想知道 C++ 专家的意见。他们说传递vecval引用的效率低于价值。最好这样写:

void printStat(const std::vector<int> vec, const int val) {}

老实说,我一直使用第一个版本(在顶部)编写我的代码,并且没有真正的论据来解释为什么我的方法会比他们的更好或没有什么不同。他们的论点是,通过引用传递参数会迫使稍后在您想要其内容时取消对变量的引用,这比我通过值传递变量时要慢。

所以我的问题是:最好的方法是什么,原因是什么?

奖励问题:他们还认为,在循环中使用迭代器会比使用[]运算符访问向量的元素更有效。我看不出有任何原因,特别是因为我怀疑vec[i]在第 5 行访问两次时它会在 L1 缓存中。

谢谢你。

4

3 回答 3

4

这取决于您将如何使用vec. 如果向量中没有很多条目,可以按值传递它,因为复制会很快。但通常通过引用传递它更“有效”。

val另一方面,对于本机类型,通常不需要将它们作为常量引用传递。实际上,由于引用通常(如果不总是?)实现为引擎盖下的指针,因此将此参数作为引用传递将在 64 位机器上传递 64 位值,而对于 plain 则传递 32 位值int。由于这是一个指针,它也将使用额外的间接。

于 2013-10-29T13:04:06.880 回答
1

通过 ref 传递内置类型的对象会导致额外的负载。如果你想防止它被修改,只需使用 const int val。通过 ref 使用 std::vector 似乎绝对高效。

于 2013-10-29T13:07:27.630 回答
1

我会坚持通过 const 引用传递对象。一个例外是,如果无论如何都进行了复制(除了防止函数实现中的意外更改之外, const T 没有任何意义)。

但是:我改变了实现方式operator =

T& operator=(const T& other) {
   T(other).swap(*this);
   return *this;
}

T& operator=(T other) {
   other.swap(*this);
   return *this;
}

允许复制省略和移动语义。

于 2013-10-29T13:21:05.837 回答