Во-первых, если контейнер будет большой, то рекомендуется использовать deque
вместо vector
. Это более эффективно для добавления в начале.
Для vector
вы не можете вставлять элементы из vector
в начало, потому что первое, что происходит, - это перемещение всего объекта в векторе (и все итераторы и ссылки на эти элементы недействительны). Таким образом, вам нужно либо скопировать элементы из вектора, либо вам нужно поместить элементы вставки в начале, а затем скопировать-присваивать им. Предполагая, что тип является int
, я пойду с бывшим:
if (v.size() >= 2) {
int tmp[] = {*(v.end() - 2), *(v.end() - 1)};
v.insert(v.begin(), tmp, tmp + 2);
tmp[0] = v[2]; tmp[1] = v[3];
v.insert(v.end(), tmp, tmp + 2);
}
Кроме того, это использует больше памяти, но, возможно, будет легче читать. В качестве бонуса он дает сильную гарантию исключения даже с типами, которые может создавать броузер. Мой код выше может быть сделано, чтобы предложить надежную гарантию, добавив вызов reserve
, но только потому, что int
тривиальный тип:
if (v.size() >= 2) {
std::vector<int> new_v;
new_v.reserve(v.size() + 4);
new_v.insert(new_v.end(), v.end() - 2, v.end());
new_v.insert(new_v.end(), v.begin(), v.end());
new_v.insert(new_v.end(), v.begin(), v.begin() + 2);
v.swap(new_v);
}
Для deque
вам не нужно хранить какие-либо элементы за пределами контейнера условии, что вы используйте ссылку вместо итератора для доступа к ним. Опять же, это дает только основную гарантию исключения.
if (v.size() >= 2) {
v.push_front(v.back());
v.push_front(*&(v.end() - 1));
v.push_back(*&(v.begin() + 2));
v.push_back(*&(v.begin() + 3));
}
Является 'вектор :: вставка()' не достаточно для вас? –
Вы хотите добиться чего-то вроде периодических границ? Если да, вам лучше пойти с применением оператора модуля в индексе. – Markus
@Markus да, но чем мне нужно MPI_Отправить этот вектор, и я думаю, что это самый простой способ продолжить мой код. – Wellen