我想创建一个程序,使用向量对其进行排序,以便进行测试。所以我想通过一个基准来计算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;
}
答案 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
将从您传入的任何向量中复制为第二个参数。
从设计的角度来看,最好制作副本然后传递引用。排序应更改正在排序的内容;在代码上下文中传递值意味着什么都无法检查排序结果。