Флейм
GameDev.ru / Флейм / Форум / C++03 - удалить из вектора целых элементы меньше 10 (9 стр)

C++03 - удалить из вектора целых элементы меньше 10 (9 стр)

Поделиться
Страницы: 18 9 10 1117 Следующая »
CasDevПостоялецwww6 дек. 20173:04#120
> О какой совместимости шла речь, когда в vector вводили методы, работающие только с итераторами?
Почему вместо:
vec.erase(4, 9)
Я должен писать эту дич:
vec.erase(vec.begin()+4, vec.begin()+9);
?

Потому что в 90-ые годы были компьютеры с ~16 Мб (это я задираю планку, столько имел новый комп в 1999 году) оперативки и процессорами, работающими медленнее нынешних раз этак в 100. Поэтому то, что делает сегодня интеллектуальный компилятор, приходилось делать ручками.

К слову, Степанов STL с шаблонами выкатил в 1995 году. Я боюсь представить, какие тогда были машины.

Работа с последовательностями как была итеративной, так и осталась )))

Правка: 6 дек. 2017 3:23

ZefickПостоялецwww6 дек. 20177:33#121
MrShoor
> намного хуже читается:
  Только неосиляторами. Что тут сложноно то? erase, remove, bind, less - это всё обычные библиотечные алгоритмы. Мозга нормального программиста уж должно хватать, чтобы зная их понять, что делает код.
=A=L=X=Постоялецwww6 дек. 20177:43#122
CasDev
> Почему вместо:
> vec.erase(4, 9)
> Я должен писать эту дич:
> vec.erase(vec.begin()+4, vec.begin()+9);
> ?
>
> Потому что в 90-ые годы были компьютеры с ~16 Мб (это я задираю планку, столько
> имел новый комп в 1999 году) оперативки и процессорами, работающими медленнее
> нынешних раз этак в 100. Поэтому то, что делает сегодня интеллектуальный
> компилятор, приходилось делать ручками.

Но в vec.erase(4,9) нет ничего, что мог бы улучшить интеллектуальный компилятор по сравнению с vec.erase(vec.begin()+4, vec.begin()+9).

MrShoorУчастникwww6 дек. 20178:45#123
Zefick
>   Только неосиляторами. Что тут сложноно то? erase, remove, bind, less - это
> всё обычные библиотечные алгоритмы. Мозга нормального программиста уж должно
> хватать, чтобы зная их понять, что делает код.
Звучит как: "Я осилил жрать говно, а ты нет".
Спасибо, я воздержусь. И приятного аппетита там.
0xc0deПостоялецwww6 дек. 201714:07#124
arr.erase( std::remove_if( arr.begin(), arr.end(), std::bind2nd( std::less<int>(), 10 ) ), arr.end() );

Это конкурс на то, как в одну строчку написать программу :) Наверное все-таки stl делали для студентов и олимпиадников.

CasDevПостоялецwww6 дек. 201715:18#125
=A=L=X=
> Но в vec.erase(4,9) нет ничего, что мог бы улучшить интеллектуальный компилятор
> по сравнению с vec.erase(vec.begin()+4, vec.begin()+9).

А я вот вижу, что справа у нас стоит итератор - а слева int.
С какой радости компилятор должен заменить int на std::vector<int>::iterator, или std::Тип коллекции<int>::iterator?

=A=L=X=Постоялецwww6 дек. 201715:55#126
CasDev
> А я вот вижу, что справа у нас стоит итератор

Не итератор, а сумма итератора с int, то есть индексация, полноценная индексация.
ptr + i в сишечке полностью под капотом эквивалентно ptr[ i ]

CasDevПостоялецwww6 дек. 201716:07#127
=A=L=X=
> Не итератор, а сумма итератора с int

И? В результате операции у нас итератор поменялся на int? Или остался тем же самым итератором?
Каким образом компилятор должен понять, что в выражении
vec.erase(4, 9)
int следует заменить на std::(CollectionType)<int>::iterator?

Распишите шаги, будет сразу понятно.

desssПостоялецwww6 дек. 201716:13#128
MrShoor
> О какой совместимости шла речь, когда в vector вводили методы, работающие только с итераторами
MrShoor
> работающие только с итераторами
MrShoor
> только с итераторами

CasDev
Ты хочешь сказать, что нельзя было перегрузить методы принимающие итераторы методами принимающими индексы?
Причем тут вообще компиляторы и производительность машин?

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

Правка: 6 дек. 2017 16:20

=A=L=X=Постоялецwww6 дек. 201716:38#129
CasDev
> И? В результате операции у нас итератор поменялся на int?

Какой операции?
Еще раз:

ptr + i в сишечке полностью под капотом эквивалентно ptr[ i ]

То есть:
vec.erase(vec.begin()+4, vec.begin()+9) 
это то же самое что 
vec.erase(vec.begin()[4], vec.begin()[9])
внимание вопрос - почему компилятору должно быть труднее в чём то оптимизировать код:
vec.erase(4, 9)
чем вышенаписанное
?
Тут вообще нечего оптимизировать...

Правка: 6 дек. 2017 16:39

ArochПостоялецwww6 дек. 201716:46#130
CasDev
> Почему вместо:
> vec.erase(4, 9)
> Я должен писать эту дич:
> vec.erase(vec.begin()+4, vec.begin()+9);
> ?
Почему то вспомнилось чем отличается программист от кодерка :)
CasDevПостоялецwww6 дек. 201717:18#131
desss
> Ты хочешь сказать, что нельзя было перегрузить методы принимающие итераторы
> методами принимающими индексы?

Естественно. std::vector - не единственный контейнер в STL, есть и другие.

CasDevПостоялецwww6 дек. 201717:31#132
=A=L=X=
> vec.erase(vec.begin()+4, vec.begin()+9)
> это то же самое что
> vec.erase(vec.begin()[4], vec.begin()[9])

Еще раз.
Мы берем

vec.erase(4, 9)
И думаем, на каком основании компилятор должен заменять int типом std::(Тип коллекции)<int>::iterator

=A=L=X=Постоялецwww6 дек. 201717:34#133
CasDev
> И думаем, на каком основании компилятор должен заменять int типом std::(Тип
> коллекции)<int>::iterator
А зачем ему тут вообще чего то заменять? Тут у него прямое руководство к действию - вызвать метод vec.erase с двумя параметрами типа int. Зачем тут что-то заменять?

Другое дело - что почему ты решил, что внутри этого метода какая то неоптимальная реализация удаления элементов?
Еще раз, вот этот код:
> vec.erase(vec.begin()+4, vec.begin()+9)
уже делал сложение указателей с int - то есть индексацию.
Почему ты решил что внутри erase(4,9) их уже нельзя делать в том или ином виде?

MAMOHT-92Постоялецwww6 дек. 201717:47#134
=A=L=X=
> Почему ты решил что внутри erase(4,9) их уже нельзя делать в том или ином виде?
или хотя бы внутри сделать vec.begin()+4, vec.begin()+9, зная изнутри, значение begin(), лол
Страницы: 18 9 10 1117 Следующая »

/ Форум / Флейм / Программирование

2001—2017 © GameDev.ru — Разработка игр