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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 49, средняя оценка - 4.63
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
21.05.2010, 23:08     Вопросы по std::list #1
1. Как обменять в списке два его элемента? Желательно большое быстродействие т.е. без удалить оба а потом добавить в другом порядке, т.к. хранятся крупные объекты
2. Для чего нужен метод max_size? Ведь список динамически расширяется и может содержать сколь угодно элементов...

Добавлено через 20 часов 8 минут
up up
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.05.2010, 23:14     Вопросы по std::list #2
Цитата Сообщение от insideone Посмотреть сообщение
т.к. хранятся крупные объекты
Тогда лучше указатели в списке хранить, а не сами объекты. А так вот: http://www.cplusplus.com/reference/algorithm/swap/
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
21.05.2010, 23:52  [ТС]     Вопросы по std::list #3
Цитата Сообщение от easybudda Посмотреть сообщение
Тогда лучше указатели в списке хранить, а не сами объекты
Возможно, т.е. я делаю x = new object а потом контейнер.add(x) и в нем теперь хранится указатель. Не забыть бы теперь удалить...

А swap это так?
C++
1
2
3
iterator i1;
iterator i2;
(*i2).swap(*i2);
А то я начал свой список писать но понял что проку с него будет не больше чем со стандартного вот только обмена местами нехватает, т.к. в игре есть одно меню и второе меню, чтобы одно перекрывало другое и наоборот можно просто объекты в очереди прорисовки (список) менять местами
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
21.05.2010, 23:55     Вопросы по std::list #4
Цитата Сообщение от insideone Посмотреть сообщение
т.е. я делаю x = new object а потом контейнер.add(x)
Ага, примерно так.
Цитата Сообщение от insideone Посмотреть сообщение
А swap это так?
почти...
C++
1
std::swap(*i1, *i2);
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
22.05.2010, 00:09  [ТС]     Вопросы по std::list #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 сделаны.
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
22.05.2010, 00:16     Вопросы по std::list #6
Цитата Сообщение от insideone Посмотреть сообщение
Для чего нужен метод max_size? Ведь список динамически расширяется и может содержать сколь угодно элементов...
это константный метод, и как раз таки показывает чему равно "сколь угодно" элементов )
а так как size() возвращает long, max_size() вернёт 2^32 - 1

Цитата Сообщение от insideone Посмотреть сообщение
А метод insert работает достаточно быстро? Не перетряхивая весь список?
на list все втавки быстро работают, в отличии от вектора
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
22.05.2010, 00:19  [ТС]     Вопросы по std::list #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 вкрадываются подозрения и руки чешутся написать попроще как то
Roma_F
331 / 246 / 5
Регистрация: 13.12.2009
Сообщений: 589
22.05.2010, 00:23     Вопросы по std::list #8
Цитата Сообщение от insideone Посмотреть сообщение
но глядя на адский код stl вкрадываются подозрения и руки чешутся написать попроще как то
может для игры и имеет смысл
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
22.05.2010, 00:24     Вопросы по std::list #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;
insideone
Модератор
Автор FAQ
 Аватар для insideone
3620 / 898 / 47
Регистрация: 10.01.2010
Сообщений: 2,422
22.05.2010, 00:31  [ТС]     Вопросы по std::list #10
alex_x_x, и все же 123 )

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

C++
1
std::swap(*i1, *i2);
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.05.2010, 00:41     Вопросы по std::list
Еще ссылки по теме:

Static std::list C++
Реализация std::list, сложность list::size() C++
Непосредственное удаление из std::list C++

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

Или воспользуйтесь поиском по форуму:
alex_x_x
бжни
 Аватар для alex_x_x
2441 / 1646 / 84
Регистрация: 14.05.2009
Сообщений: 7,163
22.05.2010, 00:41     Вопросы по std::list #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;
}
Yandex
Объявления
22.05.2010, 00:41     Вопросы по std::list
Ответ Создать тему
Опции темы

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