按值传递矢量

时间:2015-02-15 18:26:47

标签: c++

我想创建一个程序,使用向量对其进行排序,以便进行测试。所以我想通过一个基准来计算CPU时间,该基准对矢量进行一定次数的排序。因此,原始向量需要保持不变,然后使用另一个向量,以便对其进行排序。

所以我所做的就是......

#include <iostream>
#include <vector>
#include <random>
#include <chrono>
using namespace std;

typedef vector<int> intv;

 int main(){
 intv vi;
 // Stuff to create my vector with certain characteristics...
 intv vii=vi;
 cout << "Size: \n";
 cin >> tt ;

 for(i=0; i<tt; ++i){
    tb=sort(t,vii);
    m=m+tb;
    vii=vi;
    }
  m=m/tt;
  cout << "BS" << m << "\n";

  }

所以我通过引用传递向量,并为每个排序创建一个副本,以便我可以再次对它进行排序。我怎样才能更好地做到这一点?按价值传递它是否更好,在这种情况下,有人能为我提供最佳方法来做到这一点吗?

sort 是一个基本的冒泡排序功能:

double sort(int t, intv &vii){
vii.reserve(t);
bool swapped=true;
int a;
auto t0 =chrono::high_resolution_clock::now();
while (swapped==true){
        for (int i=1; i<t; ++i){
                swapped=false;
                if (vii[i-1]>vii[i]){
                        a=vii[i];
                        vii[i]=vii[i-1];
                        vii[i-1]=a;
                swapped=true;
                }
        }
        t=t-1;
}
auto t1 = chrono::high_resolution_clock::now();
double T = chrono::duration_cast<chrono::nanoseconds>(t1-t0).count();
return T;

}

2 个答案:

答案 0 :(得分:0)

一旦排序,你必须做一些相当于:

的事情
vii=vi;

我认为将vi分配给vii将是将vi的内容复制到vii的最有效方法。你可以尝试:

size_t index = 0;
for ( auto const& val : vi )
{
   vii[index++] = val;
}

但是,如果第二种方法比第一种方法更有效,我会感到非常惊讶。

答案 1 :(得分:0)

就地排序和制作矢量副本没有错。您拥有的代码应该可以使用,但不清楚参数t的来源。

请注意,语句vii.reserve(t)在您的排序例程中没有做任何有用的事情:t小于或等于vii的大小,在这种情况下,保留调用会没有,或者它大于vii的大小,在这种情况下,您正在访问向量范围之外的值。最好根据矢量大小检查t,如果太大则抛出错误或类似错误。

按值传递很简单:只需将您的排序例程声明为double sort(int t, intv vii)。调用该函数时,vii将从您传入的任何向量中复制为第二个参数。

从设计的角度来看,最好制作副本然后传递引用。排序更改正在排序的内容;在代码上下文中传递值意味着什么都无法检查排序结果。