2015-02-15 3 views
1

Я хочу создать программу, которая использует вектор, чтобы отсортировать его по причинам тестирования. Поэтому я хочу рассчитать время процессора по эталону, который сортирует вектор в определенное количество раз. Таким образом, исходный вектор должен оставаться постоянным, а затем использовать другой вектор, чтобы его можно было сортировать.Передача вектора по значению

Так что я сделал это ...

#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"; 

    } 

Так я передаю вектор по ссылке, и сделайте копию для каждого сортировки, так что я могу сортировать его снова. Как я могу сделать это лучше? Лучше ли передавать его по значению, и в этом случае, может ли кто-нибудь предоставить мне минимальный пример наилучшего способа сделать это?

рода является основной функцией сортировки пузырь:

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

К сожалению, это была опечатка от копирования фрагментов кода. – D1X

+0

Есть ли причина, по которой вы не используете алгоритм сортировки STL? – dspfnder

+0

Для целей тестирования. Действительно, я не только использую этот алгоритм сортировки. – D1X

ответ

0

После того, как вы разобрались, что вам нужно сделать что-то, что эквивалентно:

vii=vi; 

Я думаю, присваивающей vi к vii будет является наиболее эффективным способом копирования содержимого vi по номеру vii. Вы можете попробовать:

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

Однако, я буду очень удивлен, если второй метод более эффективен, чем первый.

+0

Ahm ... Означает ли это, что мой код не работает так, как есть? – D1X

+0

Он должен работать так, как есть. –

+0

Ах, ладно, спасибо. – D1X

0

Ничего плохого в сортировке на месте и копировании вектора. Код, который у вас есть, должен работать, хотя неясно, откуда идет ваш параметр t.

Обратите внимание, что заявление vii.reserve(t) не делает ничего полезного в своем роде рутинного: либо t меньше или равен размеру vii, в этом случае резервный вызов не делает ничего, или это больше, чем размер vii , и в этом случае вы получаете доступ к значениям вне диапазона вектора. Лучше проверить t против размера вектора и выбросить ошибку или аналогичную, если она слишком большая.

Передача по значению прямолинейна: просто объявите о своем роде как double sort(int t, intv vii). Когда функция вызывается, vii будет скопирован из любого вектора, который вы передадите в качестве второго аргумента.

С точки зрения дизайна, однако, лучше сделать копию, а затем передать ссылку. Сортировка должно изменить сортировку; передача по значению в контексте вашего кода означает, что ничто не сможет проверить отсортированный результат.

Смежные вопросы