Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> выбор контейнера и не только, выбор контейнера и не только 
V
    Опции темы
sdukshis
Дата 23.4.2009, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 92
Регистрация: 23.3.2009

Репутация: нет
Всего: 1



Если подобные операции приходится проводить часто, то использование vector действительно не разумно.
Я бы предложил использовать set или list совместно с find_if
Пример с set
Код

#include <iostream>
#include <set>
#include <algorithm>

using namespace std;

void print(int d){
    cout << d << " ";
}

int main(){
    int a[]={1,3,5,7,9,11};
    const size_t n = sizeof(a)/sizeof(int);
    set<int> S(a,a+n);

    cout << "S = [";for_each(S.begin(),S.end(),print); cout << "]\n";

    set<int>::iterator i = S.find(7);
    S.erase(i);

    cout << "S = [";for_each(S.begin(),S.end(),print); cout << "]\n";

    S.insert(2);

    cout << "S = [";for_each(S.begin(),S.end(),print); cout << "]\n";

    return 0;
}


Пример с list и find_if
Код


#include <iostream>
#include <list>
#include <algorithm>

using namespace std;

void print(int d){
    cout << d << " ";
}

int main(){
    int a[]={1,3,5,7,9,11};
    const size_t n = sizeof(a)/sizeof(int);
    list<int> L(a,a+n);

    // меняем 7 на 2    

    cout << "L = ["; for_each(L.begin(),L.end(),print); cout << "]\n";
    // Находим и удаляем 7
    list<int>::iterator i = find(L.begin(),L.end(),7);
    L.erase(i);

    cout << "L = ["; for_each(L.begin(),L.end(),print); cout << "]\n";
    // Находим место для 2 и вставляем её
    i=find_if(L.begin(),L.end(),bind2nd(greater<int>(),2));
    L.insert(i,2);

    cout << "L = ["; for_each(L.begin(),L.end(),print); cout << "]\n";


    return 0;
}



Это сообщение отредактировал(а) sdukshis - 23.4.2009, 10:40
PM MAIL   Вверх
Paspartu
Дата 23.4.2009, 23:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



To mes. Извините, что отвечаю с такими задержками на работе Интернета нет только локалка без выхода в мир… Да, совершенно верно, в данном случае, если в 5 пункте сдвинуть С на позицию X = 170, то отрезок С стал бы «чисто» ничего раздвигать и сдвигать не надо, после перемещения происходит только сортировка. Причем у отрезка сбросился бы сохраненный отрезок под чьим прессингом он находился для данного случая сбросилось бы упоминание об отрезке E. Т.е. тот отрезок который переносится считается основным, а все остальные работают под него (если происходит сдвиг). А вот если бы после того как подвинули С на 170, придет событие что надо отрезок E установить в позицию 75 то естественно отрезок B сдвинется на освободившееся место Bx = 45… Ex = 80 -> Bx = 50… Ex = 85-> Bx = 50… т.е. отрезок B будет двигаться вслед переносимому отрезку E, пока не будет полностью погашено его смещение вызванное именно этим отрезком (E), после чего вся информация об смещении у отрезка B сбрасывается. Но здесь все просто, когда нет перескоков, то сортировка не нужна, а вот с перескоками дела обстоят сложнее.

To sdukshis. Спасибо за отзыв, постараюсь разобраться с предложенным вариантом. Склоняюсь в сторону std::list, а дальше видно будет… smile 

PM MAIL   Вверх
mes
Дата 27.4.2009, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(Paspartu @  23.4.2009,  22:33 Найти цитируемый пост)
Но здесь все просто, когда нет перескоков, то сортировка не нужна, а вот с перескоками дела обстоят сложнее.

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


--------------------
PM MAIL WWW   Вверх
Paspartu
Дата 28.4.2009, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 3.5.2007

Репутация: нет
Всего: нет



Огромное спасибо mes и sdukshis! Вопрос закрыт!
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1035 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.