LINUX.ORG.RU

foreach в c++

 ,


1

4

Как я ждал этого!!!

Начал писать на php и использовать тамошний foreach. Удобная конструкция скажу я вам; заметил, что обычным for вообще почти перестал пользоваться. На C++ же делал по-старинке/по-привычке: for (int i=0;i<N;i++) . Это раз. Кроме того, в C++ очень напрягала работа с STL/итераторами: монструозные конструкции выходят.

Про развитие C++ читал, но никак не доходили руки. И вот решил попробовать:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
  vector<uint> v;

  v.push_back(3);
  v.push_back(5);
  v.push_back(6);

  // Вот здесь!!!
  for(auto i:v)
    cout << i << " ";

  cout << "\n";

  return 0;
}
$ g++ -std=c++11 delme3.cpp -o delme3 && ./delme3
3 5 6
Да здравствует более читабельный код!!!

Если кто еще не пробовал - рекомендую!

★★★★★

Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от tailgunner

Только ты даже близко со мной не валялся, поэтому из твоих уст это слышать смешно.

А так де, первокурсник мне говорит, что я могу писать банальщину. Только в этом мире у пропацанов всё банальщина, ибо вся сложность в твоей небональщине связана лишь с неосиляторством.

Вот плюсы, что реально нужно от плюсов? Вменяемый компилтайм( не ущербанские шаблоны), аля лисп и такие же макровозможности. Улучшенная перевариемость констант, ибо в сишке с этим бида. Ну и так помелочи.

Что мы реально имеет? Всякие ненужности, аля стл, бусты и прочую ересь. Тысячи тонн шаблонного недокода, фичи с ненужными шаблонами и т.п. Это не банально, но это не нужно.

Плюсы остановили развитие сишных конпеляторов, ибо те же ггцзапилишьки анально карпят над недоплюсами, а на переосмысливание сишки у них просто нет времени.

Поэтому да, ты можешь сколько угодно говорить о твоих плюсах и твоей небанальщине, но это не нужно.

А про банальщину - ты лучше этой банальности не напишешь, так зачем ты нужен со своими плюсами?

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

Мой первый коммент в этой теме.

А зачем тебе эта жизнь, эти проблемы? Зачем голова? Зачем что-то понимать, если это только мешает?

Пора привыкнуть, что тут есть сайзофы, а вот индексов никаких нет.

Если ты хочешь играть в игрушечки - для тебя придумали всякие рубины и же сн им. Там нет никаких сейазофов, нет нечего - применя что хочешь.

В сишке этого нет, и в плюсах не должно быть, но плюсы сдохли и становятся второй жавой( скоро запилят ГЦ, потом ВМ). Из-за таких как ты, который вместо того, чтобы уйти в рубисты убивает плюсы.

Так делать плохо и ничего из этого не выйдет.

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

Что такое гинератор простых чилес

google «простые числа». Для натуральных:

#include <iostream>
#include <iterator>

#include <boost/range/iterator_range.hpp>

class inc_iterator_t : public std::iterator<std::input_iterator_tag, int> {
    int n;
public:
    inc_iterator_t() : n(-1) {}
    inc_iterator_t(int n_) : n(n_) {}
    inc_iterator_t& operator++() { ++n; return *this; }
    /* Для простых -- правим тут ^ */
    bool operator!=(const inc_iterator_t& rhs) { return n != rhs.n; }
    int& operator*() {return n;}
    /* ... */
};

int main ()
{
    using namespace std;
    using namespace boost;

    for (auto const &n : make_iterator_range(inc_iterator_t(0), inc_iterator_t(5)))
        cout << n << endl;
}

а как ты собрался перебирать дерево я вообще не представлю.

http://en.wikipedia.org/wiki/Tree_traversal. Напрмер, с boost.filesystem можно сделать так:

#include <iostream>

#include <boost/filesystem.hpp>
#include <boost/range/iterator_range.hpp>

int main()
{
    using namespace std;
    using namespace boost;
    using namespace boost::filesystem;

    for (auto const &x : make_iterator_range(recursive_directory_iterator("/usr"),
                                             recursive_directory_iterator()))
        cout << x.path() << endl;
}
quasimoto ★★★★
()
Последнее исправление: quasimoto (всего исправлений: 1)
Ответ на: комментарий от anonymous

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

А потом тратить мильярды сил на запил оптимизаторов, которые из месева этого щита пытаются выжать перфоманс.

В чём смысл, объясни мне? И почему это должно быть в С++?

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

В чём смысл? Исходя из The C++ Source Bjarne Stroustrup (January 2, 2006) A Brief Look at C++0x. Именно для снижения порога вхождения новичков и завоевания популярности. Как я понимаю, твой тезис в том, что эта ниша простого, популярного и немного тормознутого^W^W языка занята. И С++ только зря пытаются сделать модным, вместо предложенных выше тобой нововедений,

anonymous
()
Ответ на: комментарий от quasimoto
int main (void) {  
  uint64_t n = -1;
  while(++n != 5)
    fprintf(stdout, "%lu\n", n);
}

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

Да я не про это спрашиваю. Естественно можно написать кастыль над чем угодно, только зачем? Вобщем ладно это моё понимание перебора.

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

Да ты помжешь пройтись по дереву, но ты пройдёшь хренпойми как и это ещё один цикл над циклами. Для бревна можно запилить намного более быструю, простую и удобную «сделать это для всех».

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

Да, это попытка сделать С++ популярным. Только популярным он станет тогда, когда будет 2-м пхп или жавой, а тогда он потеряет всех свои плюсы, как наследник Си.

Да, да, я понял шутку про «немного тормазнутого».

Да, он не будет модный - он сейчас более менее модный, ибо он типа как жава, но не тормазит как кусок какахи. Поэтому его юзают в основном те, кто ещё не забыл слово «перфоманс»( и то тупо как Си с классами).

Да, если бы его сделали реальным наследнеком Си и выбрали в ЦА не анскильных жабистов и прочих студентов, а Си-отцов, то он бы был намного лучше.

Так же история с линуксом, люди просто пытаются сделать из линукса венду. Зачем делать из линукса венду ради популяризации? Он всё ровно не будет вендой никогда, лучше пусть у него будет те же 3%, но он оставит за собой наследие юникса( который был создан как ОСь для труЪ пацанов), а не кинет всё наследие и превратится в кусок какахи с линукс-ведром.

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

Плюс, for без {} вообще нечитабельный

Вполне себе читабельный. особенно если после этого идет пустая строка. Нечитабельный код, в котором подряд идут несколько for, а на практике несколько if с одним оператором в «блоке» и когда ты это пишешь со скобками.

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

Знаешь, после твоих постов, где ты только обсираешь, а примеры кода приводишь короткие, рваные и неуниверсальные, непонятно, почему ты что-то говоришь о «си-отцах». Пусть «си-отцы» сами за себя говорят, ага.

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

Аминь.
v = [3, 5, 6]
puts v.join(' ')

Повеселил, повеселил старика. А теперь перед этим единичку прибавь к каждому (:

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

Такая точка зрения имеет место быть. Часть аудитории на ЛОРе высказывали её в той или иной степени.
И скорее всего, я принадлижу к быдлецу в вашем понимании, но ничего страшного.
Bioreactor расскажите скорее про традиции.

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

тормазящую жабаподобную хрень

Ээээ. А ничего, что в некоторых случаях С++ позволит сделать код который быстрее (работает), чем на С?

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

И заметь — gcc -S / g++ -S будет один и тот же (unrolling на малых итерациях и обычные условные прыжки иначе). Теперь представь, что поток вещей (тут — чисел) более сложный и ты хочешь его (поток) передать в или вернуть из другой функции чтобы та этот поток вычерпывала или создавала — свой while ты туда не передашь и не вернёшь — будешь писать его снова и снова, а итератор который инкапсулирует способ перебора и текущее состояние — можно. Опять же, простой while/for можно написать несколько раз (только за индексами следить внимательней), ок — более сложный перебор уже неохота (как во втором примере).

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

только зачем?

Для читаемости, типобезопасности, невозможности запороть ++-ом не того чего нужно или спутать индексы, для обобщения интерфейса («итератор») и единократной реализации (собственно, процесса итерации), для алгоритмов высшего порядка (типа как в <algorithm>). Перформанс тут остаётся тем же (если его специально не портить как-то).

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

Универсально нужнан еосилятору. Я привожу полные, целые куски кода, которыепрекрасно решают ту задачу, о которой говорится.

Твоя универсальность меня не интересует, поэтому это не более, чем балаболизм. Ну уж сишку я осилил на уровне отцов, к этомут ы не придерёшься.

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

Нет таких случаев, ниодного. Это мифы неосиляторов, я уже называл вам пример ваших «быстрее работает» - недавние пару статей на хабре, где автор просто былинно слился и написал полную муть.

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

И заметь — gcc -S / g++ -S будет один и тот же (unrolling на малых итерациях и обычные условные прыжки иначе).

Это потомучто у тебя константы, на g++ были ститы милларды времени, а твой код изимоден.

Теперь представь, что поток вещей (тут — чисел) более сложный и ты хочешь его (поток) передать в или вернуть из другой функции чтобы та этот поток вычерпывала или создавала — свой while ты туда не передашь и не вернёшь — будешь писать его снова и снова, а итератор который инкапсулирует способ перебора и текущее состояние — можно.

А вот тут уже оптимизатор зафейлится. И чем сложнее будет твоя байда - тем больше он будет фейлить.

Для этого есть инлайн, а функции не нужны. Всё это реализуется проще, быстрее, и компактней на голой Сишке.

Опять же, простой while/for можно написать несколько раз (только за индексами следить внимательней), ок — более сложный перебор уже неохота (как во втором примере).

Более сложный перебор у тебя есть в кишках твоего буста - запили себе функцию «каль для всех». Будет проще, быстрее и компактней твоего ужоса.

Для читаемости, типобезопасности, невозможности запороть ++-ом не того чего нужно или спутать индексы, для обобщения интерфейса («итератор») и единократной реализации (собственно, процесса итерации), для алгоритмов высшего порядка (типа как в <algorithm>). Перформанс тут остаётся тем же (если его специально не портить как-то).

Т.е. твоя байда на 30вырвиглазных строк более читаема, чем мои 2? Ок, буду знать.

Какая нахрен типобезопасть, это вы придумали для оправданий? Нет никаких типов. Никакая безопасность мне не упала.

Запорость, почему-то я не порю.

Никакие твои «алгоритмы» из твоих обощенных говно даже рядом не валялись с вменяемого реализоваными на сиасме узкими специализациями. Максимум, что твой оптимизатор сможет - это превратить перфоманс из твоей каши в средней Си-код студента.

Банальные оправдания.

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

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

Перебор чего угодно пилится не сложнее, чем от 1-го до 5-ти.

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

ИМХО, пони сейчас не выйдет переспорить, так как, действительно, если исходить из позиции божественный программист c инструментом, в котором можно делать всё, что хочешь, то любой чисто технический контр-пример зафейлится. Поэтому стоит предъявить в экономической плосокостью, например, скоростью написания программы, простотой поиска неосилиляторов С, etc.

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

Суть в том, что, по его мнению, он настолько божественный, что у него на си выходит быстрее[, выше, дальше], чем у любого на любом языке. И ладно бы так и было, так он шатается по всем тредам девелопмента, где его упоминали или нет, и всем об этом говорит. А когда его забанят, он зарегается заново и скажет «я же просто рубил правду-матку».

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

Ты можешь написать банальщину на уровне первокурсника и балаболить о том, сколь она совершенна, не более.

Только ты даже близко со мной не валялся, поэтому из твоих уст это слышать смешно.

Я не собираюсь валяться рядом с тобой и сужу по коду, который ты иногда (довольно редко) постишь - он весь банален, но ты носишься с ним, как курица с яйцом.

tailgunner ★★★★★
()

Опять пришел этот наркоман, и скатывает тему в срач.

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

ну а на чем ты натренировал свой царско-божественный скилл? если на fprintf(stdout, ...), то ты тут такой и нафиг не нужен.

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

Мои мысли по поводу <a href="http://habrahabr.ru/post/182428/">этой</a> статьи, а так же предыдущей статьи этого же автора.

Статья молодая и автор вроде хорош, но давайте разберёмся более детально тезисы автора:

«Независимо от аппаратной платформы» - это хорошо, но это жалкая, банальная ложь. Никакой независимости нет, да С++ код можно кросскомпилировать на иную архитектуру, но уверенности в том, что это будет «оптимизацией» нет ни у меня, ни у автора, а так же автор не осили даже написать какой х86 у него, а о тестах на 1-2иных архиктур я уж умолчу.

Си-код автора оставляет желать лучшего, ибо нет никаких, даже минимальных оптимизацией условий. Ну а про clock() мне даже говорить не хочется.

Давайте разберём всю бредовость попытки автора построить свою аргументацию на данном примере:

Автор тотально темнит. Он даже не удасужился объяснить как должен работать его пример, ибо что-то типа такого( сюда я хотел впихнуть портянку, о которой я горил ниже, но что-то немогу её найти) даёт тысячи крат. Для его случая это чуть усложняется - нам в самом простом случае надо будет перебрать все елементы из t[l] ... t[h] на остальные его поля.

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

Начало моей статейки для хабры, которую я не дописал, ибо её всё ровно не пропустят.

Код на qsort() + массивчик на 100елементов( для age), где каждый елемент - указатель на начало одного из 100 значений.

Это дало тысячикратный прирост перфоманса - код я поселя, но найду.

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

Понимаешь, чем сиасм отличается от любого друго языка? И тебе анонимус про это сказал - я могу реализовать всё, что угодно, включая все фичи твоего друго языка. А твой язык не может того, что может сиасм.

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

А ты придумай мне задачу небанальную - я уже почти допилил почти идеально решение для моего батла с белкой. Осталась одна проблема с выравниваением правых и левых соседей, но возможно сегодня, если мне будет не лень - я это допилю.

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

Ну давай, перебери все наибольшие общие подпоследовательности двух последовательностей. Так как он пишется не сложнее, чем от 1 до 5, у тебя максимум секунд 30.

Или, еще лучше, все остовные деревья графа.

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

Ты ушел от темы. Для данных конкретных условий, которые приведены в статье автора, ты согласен, что код на C++ быстрее?

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

Я написал, что для приведённых условий можно апнуть тысячи крат.

Как жешь сложно говорить с анскильными неосиляторами. Ты понимаешь, что Си-код автора щит? Ты понимаешь, что его можно заменить на одно условие? Ты понимаешь, что для того же арма и х86, даё и для тысяч других архитектур можно запилить при помощи сишки ещё более быстрый код.

Для тебе объясню, этот автор специально сделал Сикод тормазным - он поставил используемые условия самыми последними. Он не заюзал банальную оптимизацию условий.

Банальную оптмимизацию минимум<число<максимум на ((больше - число) < разница между максимум и минимумом).

Банальную оптимизацию поиска, когда происходит поиск сначала по одному условию, а уже из выхлопа поиска по одному условию - выбираются нужные.

Всё это в конечном итоге даст скорость такую же, как его щит.

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

А уж если сортировать, плюс не тухлым кусортом, а реально запилить какую-нибудь пацанскую сортировку на сложениях или прочее, да накатит ссе - автор будет глотать такую пыль, что просто его попец вспыхнет, ибо это будут уже МИЛЛОНЫ КРАТ. А сортировка будет происходить для индексов быстрее, чем его поиск сейчас.

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

Выкати пример. Что там тебе надо перебирать я не ведаю.

То, что ты там что-то перебираешь - хвали кишки своих либ. Что мне мешает запилить свои кишки?

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

Для тебе объясню, этот автор специально сделал Сикод тормазным

Тогда переделай в не-тормозной и покажи свой результат, сравни с результатом автора, благо код его выложен.

А то ты языком мелить мастак, а как до дела доходит - в кусты. Подкрепи свои слова чем-то реальным.

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

Выкати пример.

Твоя типичная тактика:)

Но да, я согласен, если ты так уперся, то ты можешь понаписывать тех же генераторов прочтых чисел, а потом приделать к ним метод get_next_prime() и утверждать, что получил тот же самый итератор. Так, штоле?

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

А как я могу знать, что ему надо? Пусть он мне напишет - я покажу, как это пишут пацаны на сишке.

А у тебя разве не так? Ты так же придулыешь метод, который юзает форич. Я могу тоже приделать метод, который будет юзать форич.

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

Вот вы - ца того пациента. Вы нихрена не понимаешь - норм пацану скажешь «сортированный индекс» - пацан поймёте, а вы нет. И поцан поймёт, почему это будет быстрее, но не вы.

Ты не понимаешь, что враиант автора не быстрее Сишки, а на 99% архитектур тормазнее. Ты не понимаешь, почему он выбрал 100000.

Ты не понимаешь, не знаешь как работают условия, что даст то, что я описал. Хотя вы тут все такие.

Ну ладно, я ради тебя запилю на сишке, а уж если у тебя есть аккаунт на хабре, ибо моё ничего не принимают, да и забанят через 2дня - я запилю ещё быстрее, если ты это запостишь.

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

Что там тебе надо перебирать я не ведаю.

Ну извини, я не виноват, что ты не знаешь элементарных определений.

То, что ты там что-то перебираешь - хвали кишки своих либ.

Не думаю, что какая-нибудь упоротая либа такое реализует.

Что мне мешает запилить свои кишки?

Так возьми и запили.

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

Так выкати код. Что ты мнёшься? Влез, начал балаболить, так слейся с четью, а не как детё.

Вон мне человек выше привёл код - я ему нормально ответил, а ты мямлишь.

Мне не интересны определния студентов, которые основанны на абстрактных понятих для шаблонов.

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

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

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

Более сложный перебор у тебя есть в кишках твоего буста - запили себе функцию «каль для всех». Будет проще, быстрее и компактней твоего ужоса.

enum break_t { stop, goon };
typedef break_t(*path_f)(const char *path);
? traverse(const char *root, const path_f path_action);

что должна возвращать traverse — там состояние незавершённого обхода? Как его можно продолжить или создать?

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

ты мне выкатываешь свою портянку

Не можешь реализовывать алгоритмы — так и скажи. Переписать код с одного языка на другой любая обезьянка справится.

Тратить на тебя время я не собираюсь. Ты сказал, что перебор чего угодно пишется не сложнее, чем от 1 до 5, не я. И кто тут слился?

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

Нет, я не спорю, я уточнил твою позицию, чтобы окончательно убедиться, что ты не хочешь представить, что есть кроме тебя еще люди, и не все из них хотят писать на си.

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

Его стратегия работает так - у тебя есть дерево с миллионом листов от 1 до 1000000, ты его траверсишь по порядку и получаешь вывод, например, 1, ..., 1000000. Он постит один цикл «дувайл» (с), в котором тупо выводит эти числа, и заявяет, что «я написал, как пацан-царь-Си-бог, на сишке, и у меня работает быстрее».

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

как ты знаешь лучше меня.

Только факты: типичный ник школоты с завышенным ЧСВ + судя по манере общения — год рождения. Т.е. тебе 14, и у тебя каникулы

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

Вполне себе читабельный.

Code Conventions с тобой не согласен, да и я тоже. Во первых, даже при беглом просмотре кода ясны границы цикла, во вторых — если потребуется дописать некую строку в тело цикла, сделать это проще, когда уже есть блок. Ну а в третьих человеческий фактор.

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

Я не хочу даже смотреть на твой щит. Зачем ты мне показываешь кастыль для того, чтобы работал твой бесполезный итератор.

В нормальном коде функция будет каллица либо в шаге цикла, либо в шаге рекурсии. Тут ненужны никакие состояние обхода и прочей кастыльной байда. Взял у ведра директорию - прочитал - встретил директорию заопенатил и погнал дальше.

Зачем мне какие-то мароки с твоими состояниями?

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