Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > вопросы по синтаксису


Автор: nexen 20.7.2009, 02:21
Код

#include<iostream>
#include<vector>
using namespace std;
int main(){
    vector<int> s;
    int i = 0;
    for(; i < 10; i++){
        s.push_back(i);
    }
    cout << "vecror s " << "created with size " << s.size() << "!\n";
    vector<int>::iterator a, b, c;
    a = s.begin();
    c = s.end();
    string cval_a = ", ";
    random_shuffle(a, c);
    for(b = a; b < c; b++){
        (b < (c - 1)) ? cval_a : cval_a = "\n";
        cout << *b << cval_a;
    }
    sort(a, c);
    cval_a = ", ";
    for(b = a; b < c; b++){
        (b < (c - 1)) ? cval_a : cval_a = "\n";
        cout << *b << cval_a;
    }
    system("pause");
}


выведет

vecror s created with size 10!
8, 1, 9, 2, 0, 5, 7, 3, 4, 6
0, 1, 2, 3, 4, 5, 6, 7, 8, 9
Для продолжения нажмите любую клавишу . . .

p.s.
это моё первое знакомство с с++ - делаю простые упражнения усложняя их самостоятельно. вопрос - насколько грамотно написан этот код , что лишнее, чего нехватает, правильно ли обьявлены типы?
ОС windows компиллятор gcc (dev-cpp).

Автор: Cheloveck 20.7.2009, 06:46
Цитата(nexen @  20.7.2009,  03:21 Найти цитируемый пост)
(b < (c - 1)) ? cval_a : cval_a = "\n";

Если b меньше c - 1, то ничего не делаем, иначе  cval_a присваивается символ перехода строки. Глупость какая-то =) Такой синтаксис используется когда 2, и только 2, варианта, например
Код

int x = ( a > b ) ? 10 : 20;


Цитата(nexen @  20.7.2009,  03:21 Найти цитируемый пост)
    int i = 0;
    for(; i < 10; i++){
        s.push_back(i);
    }

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

P.S. Побежал на работу, дальше смотреть некогда уже(((

Автор: GoldFinch 20.7.2009, 07:36
вместо
Код

    string cval_a = ", ";
    for(b = a; b < c; b++){
        (b < (c - 1)) ? cval_a : cval_a = "\n";
        cout << *b << cval_a;
    }

можно
Код

    for( b=a; b!=c &&  cout<<',' ; ++b )
        cout << *b;

или
Код

    for( b=a; b!=c; )
    {
        cout << *b++;
        if (b != c)
              cout<<',';
    }


вместо a. b, c лучше юзать осмысленные названия
вместо iterator - const_iterator
вместо использования a и с в цикле получать итераторы по-новой

Автор: andrew_121 20.7.2009, 08:01
Цитата(nexen @  20.7.2009,  02:21 Найти цитируемый пост)
(b < (c - 1)) ? cval_a : cval_a = "\n";

Эти строки только путают. Смысла в них не вижу.

Добавлено @ 08:06
Я бы сделал так:
Код

#include <iostream>    /* Для 'std::cout               */
#include <vector>      /* Для 'std::vector'            */
#include <algorithm>   /* Для 'std::generate()'        */

struct Generator {
    Generator():val(0) {}
    
    int operator()() {
        return val++;
    }
    int val;
};

void printer(int v) {
    std::cout << v << std::endl;
}

int main(int argc, const char **argv) {
    const int size = 100;
    std::vector<int> ivector(size);

    Generator generator;
    /* Заполняем вектор */
    std::generate(ivector.begin(), ivector.end(), generator);
    
    /* Тусуем */
    std::random_shuffle(ivector.begin(), ivector.end());
    
    /* Выводим в консоль. */
    std::for_each(ivector.begin(), ivector.end(), printer);

    return 0;
}


Автор: nexen 20.7.2009, 08:29
Цитата(Cheloveck @ 20.7.2009,  06:46)
Цитата

дальше смотреть некогда уже(((

ога - насчет i согласен и чё это я её вынес сам не пойму . . . , а насчет   cval_a  ты видимо проглядел обьявление string cval_a = ", ";
p.s.
int i = 0; - толкаю в цикл , - продолжаем катать дальше ! ))

Автор: azesmcar 20.7.2009, 08:30
Цитата(andrew_121 @  20.7.2009,  08:01 Найти цитируемый пост)
 std::for_each(ivector.begin(), ivector.end(), printer);

зачем так сложно?
Код

std::copy(ivector.begin(), ivector.end(), std::ostream_iterator<int>(std::cout, "\n"));

и функция printer не нужна.
Цитата(andrew_121 @  20.7.2009,  08:01 Найти цитируемый пост)
Generator generator;
    /* Заполняем вектор */
    std::generate(ivector.begin(), ivector.end(), generator);

это можно заменить на
Код

std::generate(ivector.begin(), ivector.end(), Generator());


Автор: andrew_121 20.7.2009, 08:44
Цитата(azesmcar @  20.7.2009,  08:30 Найти цитируемый пост)
std::copy(ivector.begin(), ivector.end(), std::ostream_iterator<int>(std::cout, "\n"));

Такая форма записи пугает новичков.
Да и я ее использую только если другого способа нет.


Автор: azesmcar 20.7.2009, 08:47
Цитата(andrew_121 @  20.7.2009,  08:44 Найти цитируемый пост)
Такая форма записи пугает новичков.

честно говоря большой разницы между этой формой и for_each не вижу.

Цитата(andrew_121 @  20.7.2009,  08:44 Найти цитируемый пост)
Да и я ее использую только если другого способа нет.

???

Автор: mrbrooks 20.7.2009, 08:55
Цитата(azesmcar @  20.7.2009,  08:30 Найти цитируемый пост)
зачем так сложно?    
Код

std::copy(ivector.begin(), ivector.end(), std::ostream_iterator<int>(std::cout, "\n"));



ога. а если так?
Код

BOOST_FOREACH(int i, ivector) std::cout<<i<<std::endl;


ы.

Автор: andrew_121 20.7.2009, 08:55
Цитата(azesmcar @  20.7.2009,  08:47 Найти цитируемый пост)
??? 

хз*...привычка наверное.

Автор: nexen 20.7.2009, 13:33
всем спасибо огромное, - дома посмотрю, разберусь кстати, а зачем - 
std::copy(ivector.begin(), ivector.end(), std::ostream_iterator<int>(std::cout, "\n"));
если можно единожды написать вверху using namespace std; и просто писать
copy(ivector.begin(), ivector.end(), ostream_iterator<int>(cout, "\n"));
может я не прав, но по моему так . . .
p.s.
сильно я не боюсь! )) - вобщем пока всё схватываю, - помогают навыки программирования на php и js всем огромное спасибо пишите ещё - буду рад запомнить, понять, освоить ! ))  да пребудет с вами сила ! 

Автор: azesmcar 20.7.2009, 13:39
Цитата(nexen @  20.7.2009,  13:33 Найти цитируемый пост)
если можно единожды написать вверху using namespace std; и просто писать
copy(ivector.begin(), ivector.end(), ostream_iterator<int>(cout, "\n"));
может я не прав, но по моему так . . .

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

Автор: zim22 20.7.2009, 13:40
Цитата(nexen @  20.7.2009,  13:33 Найти цитируемый пост)
если можно единожды написать вверху using namespace std; и просто писать

так и делайте. пока не поймёте в чём зло глобальных using директив

Автор: mes 20.7.2009, 13:41
Цитата(nexen @  20.7.2009,  12:33 Найти цитируемый пост)
если можно единожды написать вверху using namespace std; и просто писать

 привыкать к такому не рекомендуется  -  допустимо только на маленьких тестовых программках. smile 

Автор: azesmcar 20.7.2009, 13:43
Цитата(zim22 @  20.7.2009,  13:40 Найти цитируемый пост)
так и делайте. пока не поймёте в чём зло глобальных using директив 

ну cpp файле глобальный using никому (кроме себя любимого) не мешает, так что это индивидуально, а в заголовочных файлах - зло smile

Автор: GoldFinch 20.7.2009, 14:05
using namespace следует писать внутри функций и вообще блоков
Код

{
        using namespace std;
        cout << foo;
}

Автор: nexen 20.7.2009, 14:16
Цитата(azesmcar @ 20.7.2009,  13:43)
Цитата(zim22 @  20.7.2009,  13:40 Найти цитируемый пост)
так и делайте. пока не поймёте в чём зло глобальных using директив 

ну cpp файле глобальный using никому (кроме себя любимого) не мешает, так что это индивидуально, а в заголовочных файлах - зло smile

воооо - отлично, - уже какие то тонкости пошли , а в чем подвох то ?
p.s.
мне собсно без разницы я из класса извлеку - просто в чём соль то ? ))

Автор: azesmcar 20.7.2009, 14:22
Цитата(nexen @  20.7.2009,  14:16 Найти цитируемый пост)
воооо - отлично, - уже какие то тонкости пошли , а в чем подвох то ?
p.s.
мне собсно без разницы я из класса извлеку - просто в чём соль то ? )) 

потому что заголовочный файл может включить у себя кто-то другой и возможно ему не хочется видеть в своем пространстве имен cout, cin, list или map (хотя бы потому что у него уже есть такие классы/объекты). А вы его заставляете делать using. Нельзя же так...а вдруг он обидится smile 

Автор: Cheloveck 20.7.2009, 16:14
Цитата(nexen @  20.7.2009,  09:29 Найти цитируемый пост)
а насчет   cval_a  ты видимо проглядел обьявление string cval_a = ", ";


Да нет, не проглядел. Просто синтаксис данной конструкции следующий
Код

УСЛОВИЕ ? КОД_ЕСЛИ_УСЛОВИЕ_ВЕРНО : КОД_ЕСЛИ_УСЛОВИЕ_ЛОЖЬ;

теперь сравни со своим
Цитата(nexen @  20.7.2009,  03:21 Найти цитируемый пост)
(b < (c - 1)) ? cval_a : cval_a = "\n";

получается, что в случае, если (b < (c - 1)) истина, то будет выполняться
Код

cval_a;

иначе
Код

cval_a = "\n";

в первом случае бесполезный код.

Насчёт using namespace, пока не начал писать более или менее крупные проекты я его юзал. Но когда проекты стали состоять из множества модулей, а имена в них зачастую совпадали, я перестал их использовать. Сейчас не использую вообще. Единственное, что могу себе позволить, так это переименовать длинные пространства в более удобные, например
Код

namespace bi = boost::interprocess;


Автор: nexen 20.7.2009, 16:37
у меня уже совсем башка не варит - дома посмотрю - уверен , что ты прав я знаю, что это вобщем тот же if(){}else{} - видимо головой не думал совсем когда это писал

Автор: mes 20.7.2009, 18:14
Цитата(GoldFinch @  20.7.2009,  06:36 Найти цитируемый пост)
    for( b=a; b!=c &&  cout<<',' ; ++b )
        cout << *b;

имхо нежелательно использовать конструкции идущие против логики.
она почти настолько же груба, как и :
Цитата(nexen @  20.7.2009,  01:21 Найти цитируемый пост)
(b < (c - 1)) ? cval_a : cval_a = "\n";


это вот нормальный вариант:
Цитата(GoldFinch @  20.7.2009,  06:36 Найти цитируемый пост)
    for( b=a; b!=c; )
    {
        cout << *b++;
        if (b != c)
              cout<<',';
    }

как альтернатива, можно вынести одно условие из цикла :
Код

{ b=a;  if (b!=c )      cout << *b;
  for (++b; b!=c; ++b)  cout << ', '<< *b; 
                        cout << '.' << endl;
}

Автор: GoldFinch 20.7.2009, 18:41
еще можно так
Код

for( b=a; b!=c; )
    {
        cout << *b++;
        b!=c && cout<<',';
    }

Автор: 586 20.7.2009, 19:01
Цитата(GoldFinch @  20.7.2009,  19:41 Найти цитируемый пост)
еще можно так
Код
for( b=a; b!=c; )
    {
        cout << *b++;
        b!=c && cout<<',';
    }


тогда уж лучше так:
Код
for( b=a; b!=c; )
    {
        cout << *b++;
        if(b!=c) cout<<',';
    }

Автор: GoldFinch 20.7.2009, 19:37
586, так уже было

Автор: nexen 21.7.2009, 20:03
всем огромное спасибо - буду разбираться дальше 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)