Переместить элементы в векторе
От: Аноним  
Дата: 20.11.08 06:37
Оценка:
Здравствуйте

Подскажите как можно в векторе переместить элемент из середины в начало, так что сохранить последовательность.
Re: Переместить элементы в векторе
От: semlanik Россия  
Дата: 20.11.08 06:55
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте


А>Подскажите как можно в векторе переместить элемент из середины в начало, так что сохранить последовательность.


std::vector<type_t> xVector;
type_t xValue;

... //тут его заполнение

for(std::vector<type_t>::iterator xIter; xIter!=xVector.end(); xIter++)
{
   if((*xIter)==xValue)
   {
      xVector.insert(xVector.begin(), *xIter);
      std::vector<type_t>::iterator xEraseIter=xIter++;
      xVector.erase(xEraseIter);
   }
}

вот как-то так. Вроде структуры нарушить не должно. А вообще для таких вещей всеже по моему мнению праивльнее использовать двусвязные списки. std::list напимер...
Re: Переместить элементы в векторе
От: Pavel Dvorkin Россия  
Дата: 20.11.08 06:56
Оценка: -1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте


А>Подскажите как можно в векторе переместить элемент из середины в начало, так что сохранить последовательность.


1. Запомнить элемент
2. memmove кусок памяти от начала до этого элемента на 4 байта правее
3. a[0] = запомненый элемент.
With best regards
Pavel Dvorkin
Re: Переместить элементы в векторе
От: Bell Россия  
Дата: 20.11.08 07:01
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте


А>Подскажите как можно в векторе переместить элемент из середины в начало, так что сохранить последовательность.

int arr[] = {2, 1, 3};
vector<int> v(arr, arr+3);

int index = 1;
v.insert(v.begin(), v[index]);//добавляем копию требуемого элемента в начало
v.erase(v.begin() + index + 1);//удаляем исходный элемент


Сразу хочу сказать, что метод очень неэффективный, т.к. элементы контейнера копируются 2 раза. В некоторых случаях может даже случится реаллокация.

Если операция swap для элементов контейнера дешева, то можно попробовать вот такой вариант:
for(int i = index; i > 0; --i)
   swap(v[i-1], v[i]);
Любите книгу — источник знаний (с) М.Горький
Re[2]: Переместить элементы в векторе
От: semlanik Россия  
Дата: 20.11.08 07:08
Оценка:
Здравствуйте, Bell, Вы писали:

B>Если операция swap для элементов контейнера дешева, то можно попробовать вот такой вариант:

B>
B>for(int i = index; i > 0; --i)
B>   swap(v[i-1], v[i]);
B>


Пожалуй самый хороший вариант если объект вероятно находится в начале контейнера или же контейнер небольшой по размерам.
Re: Переместить элементы в векторе
От: K13 http://akvis.com
Дата: 20.11.08 09:52
Оценка: 74 (4) +1
Здравствуйте, Аноним, Вы писали:

А>Подскажите как можно в векторе переместить элемент из середины в начало, так что сохранить последовательность.


чтобы переставить M элементов начиная с N в начало вектора, нужно вызвать

std::rotate( v.begin(), v.begin()+N, v.begin()+N+M );
Re[2]: Переместить элементы в векторе
От: Кодт Россия  
Дата: 20.11.08 10:05
Оценка:
Здравствуйте, Bell, Вы писали:

B>Если операция swap для элементов контейнера дешева, то можно попробовать вот такой вариант:

B>
B>for(int i = index; i > 0; --i)
B>   swap(v[i-1], v[i]);
B>


А если копирование дешевле, чем swap, то вот такой вариант
// [0..k-1],[k] -> [k][1..k]
item_type vk = v[k];
for(int i=k; i!=0; --k)
    v[i] = v[i-1];
v[0] = vk;
... << RSDN@Home 1.2.0 alpha 4 rev. 1111>>
Перекуём баги на фичи!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.