Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.82
AnreyKazakov
Заблокирован
#1

vector, list, deque - C++

19.09.2012, 15:04. Просмотров 2782. Ответов 20
Метки нет (Все метки)

Пытаюсь разобраться, куда лучше какой контейнер применять, под какие задачи. Первый вопрос по списку:
Сказано, что список удаляет любой элемент без потери скорости, это значит, что спиок через n-ое количество удалений list великолепно фрагментирует память? как потом эти дыры заполняются если список остается неизменным?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include <list>
#include <iterator>
#include <string>
using std::cout;using std::cin;using std::endl; using std::string;
using std::getline;using std::list;
void see(list<string>::iterator ix,list<string>::iterator ixe){
    while(ix!=ixe){cout<<*ix<<" ";++ix;}
    }
int main(){
    string str;
    list<string> list1;
    while(getline(cin,str))list1.push_back(str);
    cin.clear();
    see(list1.begin(),list1.end());
    list<string>::iterator iter, contriter;
    cout<<"Введите слово, которое необходимо удалить"<<endl;
    cin>>str;
    contriter=iter=find(list1.begin(),list1.end(),str);/*ставим итератор на удаляемый элемент*/
    if(iter!=list1.end())list1.erase(iter);/*удаляем элемент*/
//cout<<"удален элемент - "<<*contriter<<" "<<endl; - опасный тип
    list1.push_back("end_element");/*добавляем элемент в конец вектора*/
    see(list1.begin(),list1.end());
    cout<<"удален элемент - "<<*contriter<<" "<<endl;/*итератор указывет на добавленный объект...*/
    return 0;
    }
Т.е. после удаления и добавления объекта итератор будет = list1.push_back() минус 1. (сразу после удаления он мусор выкидывает какой-то...)
Получается, что вроде контейнер заполнен последовательно, а в памяти список хранится как попало....
Самое непонятное, это что такое deque, если очередь хранит элементы в стиле списка, зачем ему нужно смещать при удалении все элементы? Т.е у очереди если сразу после удаления обратиться к итератору он покажет на след элемент, но тогда можно использовать вектор, зачем париться...
Конечно, плюс большой списка, что при удалении объекта с центра, кроме скорости исполнения =) еще и в том, что итераторы остаются актуальными, кроме итератора, указвающего на удаленный объект...
deque так и не понял, он тоже в памяти фрагментированл валяется? Если так, то скорость доступа к его элементам намного ниже чем у вектора... Вот такие вопросы......
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
26.09.2012, 11:40     vector, list, deque
Еще ссылки по теме:

C++ Контейнеры Vector и List (C++)
Удаление vector, list, string C++
Сортировка vector и list C++
C++ Контейнеры Vector,List
Шаблоны, vector, list C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт С++
7958 / 4720 / 319
Регистрация: 24.06.2010
Сообщений: 10,525
Завершенные тесты: 3
26.09.2012, 11:40     vector, list, deque #21
AnreyKazakov, У вектора если что есть конструктор копии.
Yandex
Объявления
26.09.2012, 11:40     vector, list, deque
Ответ Создать тему
Опции темы

Текущее время: 00:20. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru