C++, std::algorithm, WTF?!
По теме: с виду неясно, gcc не использую. Заинтригован.
Где-то в стандарте про это написано.
Ага, только не так давно мне gcc про это написал прямо - структура локальная, инстанцировать ей шаблоны нельзя, а не непонятное "нот фаунд". gcc еще более свежий - 4.4.5
Я же вроде видел сотни примеров где это делается!
@: я вообще все эти плюсовые заморочки тихо ненавижу, и полагаю, что это задача конпелятора их оптимизировать. ++it — уродское!
Твои чувства к инкрементам - дело твоё, но ты как бы посылаешь мессидж: "пацаны, а я нихера не смыслю в этих ваших префиксах/постфиксах!"
зарелизился gcc-4.5, в котором реализованы лямбды. В C++ уже столько сахара, что скоро попа слипнется.
upd: В этой версии стало можно использовать локальные и анонимные классы в качестве параметров шаблонов.
К слову, на днях upd: В этой версии стало можно использовать локальные и анонимные классы в качестве параметров шаблонов.
переносимость, батенька, если о ней не задумываться, то жопа может слипнуться, да почище, чем от сахара
а хотя, я просто бухчу, потому что лень изучать 0х, а потом каждый раз думать, а вот этот код где-нибудь в херовом месте будет запускаться или нет...
Так а что делать — вообще нельзя работать с анонимными/вложенными функторами что ли?С вложенными куда? Вроде можно в классе сделать подклассик и его использовать. По крайней мере вот это компилируется:
template <class T>
class V
{
T v;
};
class z
{
class b
{
};
V<b> bb;
};
int main
{
return 0;
}
Попробуй добавить хотя бы "volatile z z0;"
К слову, на днях зарелизился gcc-4.5Окстись, «на днях» — это уже 4.6 зарелизился.
Как так?c++ 2003
9.8 Local class declarationsc++0x : пункта 14.3.1/2 нет
1 A class can be defined within a function definition; such a class is called a local class. The name of a local
class is local to its enclosing scope. The local class is in the scope of the enclosing scope, and has the same
access to names outside the function as does the enclosing function. Declarations in a local class can use
only type names, static variables, extern variables and functions, and enumerators from the enclosing
scope.
14.3.1 Template type arguments
2 A local type, a type with no linkage, an unnamed type or a type compounded from any of these types shall
not be used as a template-argument for a template type-parameter.
14.5.2 Member templates
...
2 A local class shall not have member templates.
14.5.3 Friends
...
8 A friend template shall not be declared in a local class.
Ура! Теперь еще и range-based for-loop появился.
В C++ уже столько сахара, что скоро попа слипнется.Ой, не смешите мои тапочки.
и чем же в этом месте it++ отличается от ++it?
Сахар там если и есть, то совсем рафинированный, химической очистки.
Конечно, это компилируется, поскольку ничего шаблонного не инстанциируется .Попробуй сначала сам добавить и собрать. У меня все ок.
Попробуй добавить хотя бы "volatile z z0;"
Кроме того, инстанцирование происходит и без определения переменной типа z, т.к. в z указан V<b>, а b вполне себе конкретный класс, и z вполне себе конкретный класс. Если в V написать что-то типа typename T::type v;, тогда в моем примере будет ошибка.
Подытожу: ты написал необдуманную фигню.
и чем же в этом месте it++ отличается от ++it?блин, если it — объект, то теоретически, правильно написанный it++ чутка больше действий содержит, чем ++it и даже может быть через него реализован. Так-то.
разница в возвращаемых значениях. да, один из них должен создать временный объект, отклонировать туда себя, затем увеличить себя, вернуть неувеличенную копию, но в данном контексте оператора for это не должно иметь значения. если имеет и получаются разные объекты, то это побочный эффект одного из ++ и следовательно говнокод.
ч0? там речь была о том, что это тииипа медленнее. Причем тут говнокод?
Я проверил на vector и map в gcc — одинаково.
Я считаю недостойным своей видовой принадлежности, недостойным для носителя гордого имени Человек писать говнопрефиксный инкремент чтобы сэкономить 5% производительности в мифических говнокомпиляторах, которые не умеют производить эту тривиальную оптимизацию.
Бля, возьми и проверь что быстрее в любом нормальном компиляторе со включённой оптимизацией.бля, возьми и посчитай, сколько букв и я употребил в слове тииииипа там в посте выше.
говнопрефиксный инкремента чем тебе не угодил префиксный инкремент?
а чем тебе не угодил префиксный инкремент?ну он написал же.
недостойно настоящего программиста думать об этой чёрной работёнке*,
которую любой негр-компилятор должен уметь делать превосходно.
я вот, как программист-экзистенциалист, пишу префиксный, когда имею его в виду.
а фж, программирующий по "так говорил заратустра", делает иначе.
в целом обсуждение этого вопроса - типичное пиздобольство.
нет никакой разницы, программы никогда не ломаются из-за перепутанного инкремента.
и потом, негры-компиляторы.
ну ты понел.
* работёнка = юзать префиксный, если возвращаемое значение не используется.
ну просто такая ненависть к префиксному инкременту, как будто он пишется гораздо сложнее. Тут уже больше похоже на вредность, типа: "вот тебе компилятор, я написал i++, а тебе это надо оптимизировать!"
Да там так и есть, размеры постов и риторика выдают обоих с потрохами
ну просто такая ненависть к префиксному инкрементунет ненависти, просто любит попиздеть. =)
а - попенартурить.
ну или кто там начал этот балаган первым
нахуя я вообще в этот форум блядь пишу опять?
ты не пиши, а то от работы отвлекаешься
вы все не пишите, а то я вас читаю и тоже отвлекаюсь
Он не сложнее, но в С традиционно используется постфиксный. А я — известный поборник традиционных ценностей!
http://software.intel.com/ru-ru/blogs/2011/02/21/it-it/
В кратце: можно придумать случай, когда ++it в три раза быстрее it++ даже на современных компиляторах.
Однако если программа делает что-то существенное по времени, то такое замедление может быть критично.
fail. если программа делает что-то существенное по времени, процент времени потраченный в итераторах будет исчезающе мал. пусть программа работает пять минут и при этом тратит 1 секунду внутри итератора, вместо 0.3 секунд - это пренебрежимо мало, чтоб об этом задумываться.
если программа делает что-то существенное по времени, процент времени потраченный в итераторах будет исчезающе малкаким образом делается данный вывод?
например, поисковые или преобразующие задачи часто занимают много времени.
и при этом значительная часть времени уходит на работу с самими итераторами
зы
тот же компилятор работает долго, а навскидку большую часть времени как раз в итераторах и проводит
В кратце: можно придумать случай, когда ++it в три раза быстрее it++ даже на современных компиляторах.в дебуг версии
в дебуг версиив дебуг версиях компилят никогда не компилю.
все библиотеки должны использоваться только в продакшен-варианте, но точно с именами, на случай если упадёт.
Медленнее оно из-за ассёртов, но последние использовать — пидорство в чистом виде.
компилятору надо будет тратить время на соображение можно ли в данном месте постфиксный соптимизировать
если в проекте много человек и этот код много раз компилируется и там много итераторов, и потом это время перевести на зарплатные деньги то может наверна нехило получится
т.к. если писать по сартру (то есть выбирать оптимальный вариант самостоятельно
то время будет тратить голова программиста.
нельзя же просто везде префиксный писать.
а любое более сложное правило требует линейного по количеству операторов++ напряжения извилин.
а любое более сложное правило требует ... напряжения извилин.
для индустриальной разработки - недопустимо (c)
Учитывая, сколько нервов спасли на моих глазах assert-ы, я бы не стал такое говорить в общественных местах.
Конечно, почти всегда их надо дублировать if-ами.
Оставить комментарий
bleyman
Компилится и работает. Если раскомментировать объявление функтора внутри, гцц говорит error: no matching function for call to 'remove_if(__gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, main::remove_it)'
Как так? Проверял и на довольно свежем гцц (4.2.2).