Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.63
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
#1

Вопросы по std::list - C++

21.05.2010, 23:08. Просмотров 6264. Ответов 11
Метки нет (Все метки)

1. Как обменять в списке два его элемента? Желательно большое быстродействие т.е. без удалить оба а потом добавить в другом порядке, т.к. хранятся крупные объекты
2. Для чего нужен метод max_size? Ведь список динамически расширяется и может содержать сколь угодно элементов...

Добавлено через 20 часов 8 минут
up up
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.05.2010, 23:08
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вопросы по std::list (C++):

Реализация std::list, сложность list::size() - C++
Часто приходилось пользоваться Listом, но сейчас столкнулся с небольшой неоднозначностью. Согласно документации, метод size() в 11...

Потокобезопасность std::map::end, std::list::end - C++
Собсна сабж, могу ли я без синхронизаций выполнять подобного рода код if (myIter != map.end()) // != list.end() {...} myIter =...

Разъясните код пжлст(выдает ошибку:cannot convert from 'class std::list<class c_bullet *,class std::allocator<class c_bullet *> >::iterator' to 'int') - C++
Есть такие строки: std::list&lt;c_bullet*&gt; Bullets; ... for(auto i = Bullets.begin(); i != Bullets.end(); /**/) В строке цикла вот...

Static std::list - C++
Добрый день, помогите решить проблему. &quot;Каждое статическое поле должно быть проинициализировано до main() явным образом&quot; - как я помню...

Вопрос по std::list - C++
Не произойдёт ли здесь какая-нибудь ошибка после удаления элемента из списка? std::list&lt;int&gt; myList; std::list&lt;int&gt;::iterator iter; ...

Сортировка std::list - C++
Есть такой фрагмент програми. Создаю функцию для сортировки list. Вроде все правильно. В класе перегружены оператори &lt; i =. Не знаю что...

11
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
21.05.2010, 23:14 #2
Цитата Сообщение от insideone Посмотреть сообщение
т.к. хранятся крупные объекты
Тогда лучше указатели в списке хранить, а не сами объекты. А так вот: http://www.cplusplus.com/reference/algorithm/swap/
1
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
21.05.2010, 23:52  [ТС] #3
Цитата Сообщение от easybudda Посмотреть сообщение
Тогда лучше указатели в списке хранить, а не сами объекты
Возможно, т.е. я делаю x = new object а потом контейнер.add(x) и в нем теперь хранится указатель. Не забыть бы теперь удалить...

А swap это так?
C++
1
2
3
iterator i1;
iterator i2;
(*i2).swap(*i2);
А то я начал свой список писать но понял что проку с него будет не больше чем со стандартного вот только обмена местами нехватает, т.к. в игре есть одно меню и второе меню, чтобы одно перекрывало другое и наоборот можно просто объекты в очереди прорисовки (список) менять местами
0
easybudda
Модератор
Эксперт CЭксперт С++
9695 / 5645 / 963
Регистрация: 25.07.2009
Сообщений: 10,849
21.05.2010, 23:55 #4
Цитата Сообщение от insideone Посмотреть сообщение
т.е. я делаю x = new object а потом контейнер.add(x)
Ага, примерно так.
Цитата Сообщение от insideone Посмотреть сообщение
А swap это так?
почти...
C++
1
std::swap(*i1, *i2);
1
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
22.05.2010, 00:09  [ТС] #5
А метод insert работает достаточно быстро? Не перетряхивая весь список?
Меня пугает просто посмотрел
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    template<class _It>
        void __CLR_OR_THIS_CALL _Insert(const_iterator _Where, _It _First, _It _Last,
            input_iterator_tag)
        {   // insert [_First, _Last) at _Where, input iterators
        replace(_Where, _Where, _First, _Last);
        }
    _Myt& __CLR_OR_THIS_CALL replace(const_iterator _First, const_iterator _Last,
        const_iterator _First2, const_iterator _Last2)
        {   // replace [_First, _Last) with [_First2, _Last2), const_iterators
        if (_First2 == _Last2)
            erase(_Pdif(_First, begin()), _Pdif(_Last, _First));
        else
            replace(_Pdif(_First, begin()), _Pdif(_Last, _First),
                &*_First2, _Last2 - _First2);
        return (*this);
        }
И все вставки push в лист через insert сделаны.
0
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
22.05.2010, 00:16 #6
Цитата Сообщение от insideone Посмотреть сообщение
Для чего нужен метод max_size? Ведь список динамически расширяется и может содержать сколь угодно элементов...
это константный метод, и как раз таки показывает чему равно "сколь угодно" элементов )
а так как size() возвращает long, max_size() вернёт 2^32 - 1

Цитата Сообщение от insideone Посмотреть сообщение
А метод insert работает достаточно быстро? Не перетряхивая весь список?
на list все втавки быстро работают, в отличии от вектора
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
22.05.2010, 00:19  [ТС] #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
    abc A(1,2,3);
    abc B(2,3,4);
    abc C(3,4,5);
 
    std::list<abc> qw;
    qw.push_back(A);
    qw.push_back(B);
    qw.push_back(C);
    std::list<abc>::iterator i1 = qw.begin();
    std::list<abc>::iterator i2 = i1; i2++;
    std::swap(i1, i2);
    std::list<abc>::iterator i = qw.begin();
    for (; i != qw.end(); i++)
        std::cout << i->a;
Вывод:
123
Что то не поменялось...

Добавлено через 2 минуты
Цитата Сообщение от Roma_F Посмотреть сообщение
на list все втавки быстро работают, в отличии от вектора
По логике то да, но глядя на адский код stl вкрадываются подозрения и руки чешутся написать попроще как то
0
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
22.05.2010, 00:23 #8
Цитата Сообщение от insideone Посмотреть сообщение
но глядя на адский код stl вкрадываются подозрения и руки чешутся написать попроще как то
может для игры и имеет смысл
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.05.2010, 00:24 #9
std::list<abc>::iterator i1 = qw.begin();
std::list<abc>::iterator i2 = i1; ++i2;
std::swap(*i1, *i2);
std::list<abc>::iterator i = qw.begin();
for (; i != qw.end(); i++)
std::cout << i->a;
0
insideone
Модератор
Автор FAQ
3643 / 922 / 51
Регистрация: 10.01.2010
Сообщений: 2,479
22.05.2010, 00:31  [ТС] #10
alex_x_x, и все же 123 )

Цитата Сообщение от Roma_F Посмотреть сообщение
может для игры и имеет смысл
я вот и мечусь, то свое напишу то думаю зачем, свое долго отлаживать приходится, надоело очень...
0
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
22.05.2010, 00:34 #11
Цитата Сообщение от alex_x_x Посмотреть сообщение
++i2;
дело не в этом, swap правильно сработал, он поменял местами итераторы

C++
1
std::swap(*i1, *i2);
0
alex_x_x
бжни
2450 / 1655 / 84
Регистрация: 14.05.2009
Сообщений: 7,162
22.05.2010, 00:41 #12
*дубль*

Добавлено через 25 секунд
Цитата Сообщение от Roma_F Посмотреть сообщение
swap правильно сработал, он поменял местами итераторы
я это исправил
во, будет вам счастье

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <list>
#include <iostream>
#include <algorithm>
 
using namespace std;
 
void print( int *el ){
    cout << *el << endl;
}
 
int main(){
    int *a = new int(1), *b = new int(2);
    list<int*> l;
    l.push_back(a);
    l.push_back(b);
    list<int*>::iterator it = l.begin();
    swap( *it, *(++list<int*>::iterator(it)) );
    for_each( l.begin(), l.end(), print );
    return 0;
}
0
22.05.2010, 00:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2010, 00:41
Привет! Вот еще темы с ответами:

std::list<T*> вызвать метод - C++
Как во время просмотра MyList вызвать метод Show() каждого обьекта? class MyVehicle { public: virtual void Show() { /* ......

Реализация std::list<>::begin() - C++
Вопрос строго для знатоков реализации STL. Каким образом реализована &quot;перегрузка&quot; у списка метода begin() только по возвращаемому...

Непосредственное удаление из std::list - C++
Собственно проблема вот в чем раньше, когда я создавал игру, у меня были самодельные листы типа struct List { T data; ...

Передача std::list<> в функцию - C++
Нужно передать список строк в функцию. У меня сделано так: void f(list&lt;string&gt;&amp; list1) {...} т.е. по ссылке передаю ...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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