2016-12-03 6 views
1

В чем сложность замены двух строк в 2D-векторе и в 2D-массиве, я тестировал сложность времени на обоих, кажется, что в обмене векторов почти O(1), но в массивах работает медленнее, так что же действительно сложность, почему разные?Сложность замены двух строк в векторе и массиве с помощью функции подкачки

в массивах (очень медленно):

int arr[N][N]; 
// input the array elements 
while (q--) { // number of queires 
    int x, y; 
    scanf("%d %d", &x, &y); 
    swap(arr[x], arr[y]); 
} 

в векторах тот же код выше, но вместо того, чтобы использовать int arr[N][N] я использую vector<<vector>>

+1

Я думаю, вы вводите в заблуждение понятия сложности и экспериментальных результатов - что было быстрее, когда вы их тестировали? – tinkertime

+0

Когда я запускаю оба кода, вектор работает быстрее, я имею в виду результат вывода. –

+0

Кстати, надеюсь, вы не будете использовать эти вызовы 'scanf' в реальном коде. –

ответ

0

std::swap оптимизирует Перекачка std::vector с использованием move semantics. По существу, это сводится к замене нескольких внутренних указателей между двумя std::vector. Неважно, сколько значений в векторах. Это обмен указателей, более или менее. Постоянное время.

Нет таких ярлыков с встроенными массивами. Все значения в массивах должны быть скопированы.

Перенос семантики был одним из основных дополнений к C++ 11.

Чтобы уточнить, в упрощенных чертах, std::vector это класс, который выглядит следующим образом:

template<typename T> 
class vector { 

    T *data; 
    size_t data_size; 
}; 

Там намного больше, чем только что, но это получает через точку: все, что std::swap нужно сделать заключается в перемещении указателей (и data_size и нескольких других битов) между двумя векторами и там вы идете: содержимое векторов было заменено. Никакое фактическое копирование данных не требуется.