LINUX.ORG.RU

Перетасовывание контейнеров в С++


0

0

Путь осуществляется проход по контейнеру:

 for(std::list<int>::iterator i = list.begin(); i != list.end(); i++ ) {...} 

Вопрос: на сколько безопасно и переносимо применять внутри данного цикла операции insert, erase, splice к объекту list? Как обстоят дела с другими контейнерами - последовательностями?

Ответ на: комментарий от anonymous

даже такая конструкция как transform (data3.begin(), data3.end(), data3.begin(), bind2nd(plus<int>(), 1)); ничего не меняет.

да Вы батенька, извг'ащенцъ :)

Результаты по времени абсолютно одинаковые во всех трёх случаях.

какой компилятор и машина?

shty ★★★★★
()
Ответ на: комментарий от shty

итератора есть и для вектора и для связанного списка, а вот [] только для вектора, с учётом того что мы выяснили что при /O2 никакой разницы нет, то использовать итераторы кошернее :)

чтобы внезапно менять вектора на списки? это ж кем надо быть

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

А у вас разные результаты даёт этот пример с transform?

сейчас времени пока нет - вечерком затестю

shty ★★★★★
()
Ответ на: комментарий от jtootf

итератора есть и для вектора и для связанного списка, а вот [] только для вектора, с учётом того что мы выяснили что при /O2 никакой разницы нет, то использовать итераторы кошернее :)

чтобы внезапно менять вектора на списки? это ж кем надо быть

представьте себе - да, а что Вас не устраивает?

shty ★★★★★
()
Ответ на: комментарий от shty

представьте себе - да, а что Вас не устраивает?

тот факт, что это структуры данных для решения совершенно разных задач; они не взаимозаменимы, хоть и имеют в чём-то общий интерфейс. не отказался бы посмотреть на задачу, в которой внезапно потребовалось заменить вектор на список

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>обобщение должно применятся там, где оно имеет смысл

Капитан Очевидность согласен с Вами.

anonymous
()
Ответ на: комментарий от jtootf

>не отказался бы посмотреть на задачу, в которой внезапно потребовалось заменить вектор на список

Бывает, что надо хранить набор элементов и использовать их все за раз. Тогда пофиг, хранить ли в векторе или списке. Точнее, решение принимается в соответствии с характером вставок.

И вообще, итераторы удобны. Нет причин использовать operator[] вместо итераторов, поэтому чтобы не забивать голову рассуждениями где можно а где нельзя нормальные люди просто юзают итераторы.

anonymous
()
Ответ на: комментарий от anonymous

И вообще, итераторы удобны

не спорю. но говорить, что они удобны по причине того, что обеспечивают общий интерфейс для вектора и списка - мягко говоря, глупо

нормальные люди просто юзают итераторы

нормальные люди пишут по возможности декларативно

jtootf ★★★★★
()
Ответ на: комментарий от jtootf

>нормальные люди пишут по возможности декларативно

Конечно. И итераторы декларативнее, чем индексы. Но, конечно, ждём нормальный for с семантикой foreach.

anonymous
()
Ответ на: комментарий от shty

GCC даёт одинаковый процессорный код для итератора из п. 1 и для transorm из п. 3, не оставляя в п.3 и следа от функций transform, begin, end, bind2nd, plus<int>. Для п. 2 код немного больше по размеру.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.