2016-02-24 2 views
3

В последнее время я работаю с графиками, и я просматриваю путь от графа. Путь должен быть возвращен как вектор std, содержащий сначала все узлы с начальным узлом.C++ Std queue and vector performance

Я смотрел на два варианта: - использовать медленный метод векторной вставки для добавления узлов в передней части вектора - использовать Deque для добавления узлов в передней части (push_front), что значительно Быстрее. Затем копирование deque в вектор с помощью std :: copy

Есть ли значительное повышение производительности, используя один метод над другим?

+5

Почему бы не нажать на заднюю часть вектора вместо этого? – user2079303

+0

Я предлагаю использовать связанный список, если вам не нужен прямой доступ к элементам –

+0

Я думаю, вам следует сосредоточиться на основных алгоритмах, которые вы можете найти, но не на той важной структуре данных, которую вы выбираете, потому что оба являются O (n) для вектора и dequeue. Кроме того, вы думаете, что std :: copy не требует времени и пространства? – kaitian521

ответ

2

Поскольку вы возвращаете путь, вы, вероятно, имеете верхнюю границу по своей длине. Поэтому вы можете вызвать create vector, вызвать reserve и позже (как пишет @ user2079303) позвонить push_back, чтобы добавить вершины к пути.

const auto n = <graph_size> 
std::vector<size_t> path; 
path.reserve(n) 
... 
v.push_back(i); // Push whatever you want. 

Теперь проблема заключается в том, что, по крайней мере, от вопроса, похоже, v в обратном порядке. Тем не менее, вы можете просто позвонить std::reverse:

std::reverse(std::begin(v), std::end(v)); 

Таким образом, используя только vector:

  • Вы выделения единой структуры данных вместо двух; кроме того, используя reserve, будет выделено одно выделение памяти.

  • Использование reverse в конце просто заменяет использование copy, которое вам нужно будет сделать из deque в вектор.

+1

Вам не нужно 'std :: reverse()', если вы забудете повторить итерацию по возвращаемому значению, используя 'vector.rbegin()' и 'vector.rend()'. Если я знаю, что контейнер организован «неправильным образом», я считаю, что обратные итераторы очень полезны! – haavee

+0

@haavee Хорошая точка - вы можете также изменить «конвенцию», если это возможно. –

1

Если вы смотрите на оберточной в std::queue в std::vector то std::queue будет толкать элементы к задней вектора (быстрый способ).

Даже если, однако, не потому, что std::vector смежное хранение, можно будет из-выполнить std::deque даже если вы push_font(), потому что он хорошо играет с CPU кэшем, где перетасовки данных быстро.

Но почему бы не попробовать оба и просмотреть код, чтобы узнать, какой из них лучше?