On-line: гостей 0. Всего: 0 [подробнее..]
Программисты всех стран, объединяйтесь!

АвторСообщение



ссылка на сообщение  Отправлено: 28.07.12 18:38. Заголовок: Вывод на консоль - широкий выбор средств в С++.


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

Для примера рассмотрим вывод на консоль некоторой заданной последовательности, например, массива целых чисел.

Классический способ - это использовать цикл for и обращение к элементам массива по индексу. Такой подход всем знаком, и с него обычно начинают изучение С++.

#include <iostream> 

int main()
{
nt a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for ( size_t i = 0; i < sizeof( a ) / sizeof(( *a ); i++ )
{
std::cout << a[ i ] << " ";
}
std::cout << std::endl;

return ( 0 );
}

Сколько раз за свою практику нам приходилось писать такой код!

Второй способ более продвинутый и основан на использовании стандартных алгоритмов

#include <iostream> 
#include <iterator>
#include <algorithm>

int main()
{
nt a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

std::copy( std::begin( a ), std::end( a ),
std::ostream_iterator<int>( std::cout, " " ) );
std::cout << std::endl;

return ( 0 );
}



Это то, что было в располряжении программистов до принятия нового стандарта. Казалось бы, что этого вполне достаточно. Но не тут-то было!

Пояаились лямбда-выражения. Как же их не попробовать использовать?!
Итак, третий способ вывода на консоль массива с применением уже лямбда-выражения.

#include <iostream> 
#include <iterator>
#include <algorithm>

int main()
{
nt a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

std::for_each( v.begin(), v.end(),
[]( int x ) { std::cout << x << " "; } );
std::cout << std::endl;

return ( 0 );
}



Все? Нет, не все! Разработчики стандарта решили снова нас вернуть к проверенному и испытанному средству - циклу for. Появилась новая разновидность этого цикла - цикл for, основанный на диапазоне. Как говорится, новое - это хорошо забытое старое! Вот как быдет выглядеть этот вариант. Заранее предупреждаю, что MS VC++ 2010 не поддерживает это средство. Скорее всего оно появится в MS VC++ 2011, который Майкрософт уже предлагает своим клиентам. Тем не менее, чтобы запустить представленный пример, можно воспользоваться он-лайновым компилятором

#include <iostream> 
#include <iterator>

int main()
{
nt a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

for ( const auto &x : v ) std::cout << x << " ";
std::cout << std::endl;

return ( 0 );
}


Какой из этих способов вывода на консоль предпочтительней? Это уже решать каждому самостоятельно. Но скорей всего по моему мнению наибольшую популярность завоюет последний из приведенных способов. Особенно, если появится больше компиляторов, поддерживающих такую синтаксическую конструкцию, как цикл for, основанный на диапазоне.

P.S. Вполне возможно, что есть еще и другие варианты выполнения данной задачи. Если вы их знаете, то напишите о них.

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет


Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 22
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет