Форум программистов, компьютерный форум CyberForum.ru

Программа для создания анаграм - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Текстовое написание веденного цифрами числа http://www.cyberforum.ru/cpp-beginners/thread551399.html
Помогите пожалуйста, необходимо написать на dev-cpp программу введение числа и вывод его текстового названия с использованием массива и функции, по возможности с объяснениями. Сам первый курс, по болезни пропустил эти темы препод дал задание сижу голову над ним ломаю. вот код на форуме нарыл, но так и не разобрался что с ним делать. using System; namespace ConvertDigitsToWords { ...
C++ англо-русский переводчик помогите создать англо-русский переводчик в форме С++ builder загрузка базы данных из словоря (из Access) выбор режима(англо-русский или русско-английский) с рисунками если можно !!! Очень прошу !!! http://www.cyberforum.ru/cpp-beginners/thread551396.html
C++ задача на двумерный массив
.Задана квадратная матрица. Поменять местами строку с максимальным элементом на главной диагонали со строкой с заданным номером m решение в с++заранее благодарна
задача на двумерный массив C++
Дана квадратная матрица найти сумму элементов главной диагонали. Помогите пожалуйста решить в с++,заранее благодарна
C++ Графы:Матрица инцидентности http://www.cyberforum.ru/cpp-beginners/thread551372.html
Доброго времени суток: Такая программа: Определить является ли матрица функциональной или контрафункциональной.При запуске программы должно запускаться 5 тестовых примеров. Собственно проблемы с вводом матрицы из файла в программу и отображением на консоли. в двумерном массиве это будет выглядеть так: for (int i=0;i<(кол-во вершин);i++) { for (int j=0;j<(кол-во рёбер);j++)...
C++ Треугольник задан координатами своих вершин. Составить программу для вычисления его площади. Треугольник задан координатами своих вершин. Составить программу для вычисления его площади. Помогите разобраться с задачей. Объясняют крайне плохо, самому не получается разобраться. Пример решения видел только в Pascal( подробнее

Показать сообщение отдельно
TheAthlete
152 / 152 / 13
Регистрация: 31.08.2010
Сообщений: 535
08.05.2012, 17:36     Программа для создания анаграм
Цитата Сообщение от diagon Посмотреть сообщение
#include <iostream>
#include <vector>
#include <iterator>
int main()
{
std::vector< int > my_array
(
std::istream_iterator< int > (std::cin),
std::istream_iterator< int > ()
);
std::cout << my_array.size() << std::endl;
}
Обычная программа, правильно работает.
Но стоит только убрать все std:: и поставить вместо них using namespace std; и она уже не компилируется.
P.S. а чтобы не упариваться, можно изучить метод слепой печати, очень полезная штука в программировании.
На самом деле данную программу можно переписать по-другому, чтобы была понятна ошибка и особенность данной ошибки, точнее 2 ошибки (опишу далее):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <iterator>
 
using std::vector;
using std::cout;
using std::endl; 
 
using std::istream_iterator;
 
int main()
{
  vector<int> vec(istream_iterator<int>(std::cin), istream_iterator<int>());
  cout << vec.size() << endl;
 
  return 0;
}
Данный код нормально компилируется, но если мы опустим std у cin, то смысл данной строки кардинально изменится:

в данном случае будет определяться функция vec, возвращающая тип vector<int>. Функция vec получает два параметра:
  • Первый параметр, cin, относится к типу istream_iterator<int>. Лишние круглые скобки вокруг cin игнорируются. Т.е. cin это пользовательская переменная, которая приводится к типу istream_iterator<int>, а не библиотечный std::cin
  • Второй параметр не имеет имени. Он относится к типу указателя на функцию, которая вызывается без параметров и возвращает istream_iterator<int>

Если мы используем std::cin, то компилятор знает, что это не пользовательская переменная и все идет как надо, т..е мы здесь инициализируем вектор.

Лучшим решением данной проблемы будет либо использование круглых скобок в первом параметре, при этом отпадает необходимость следить за std в cin и в других стандартных операторах:

C++
1
vector<int> vec((istream_iterator<int>(std::cin)), istream_iterator<int>());
и если здесь мы опустим std, то компилятор нам выдаст ошибку, что оператор cin не определен в данной области видимости, что потребует отдельного включения определения using, например так:

C++
1
2
using std::cin;
vector<int> vec((istream_iterator<int>(cin)), istream_iterator<int>());
Вторым решением (более предпочтительным) является использование именованных итераторов вместо анонимных:
C++
1
2
3
4
using std::cin;
istream_iterator<int> dataBegin(cin);
istream_iterator<int> dataEnd;
vector<int> vec((dataBegin, dataEnd);
Более подробно о данной проблеме можете ознакомиться в книгах
  1. "Мейерс С. Эффективное использование STL. Библиотека программиста" Совет 6. Остерегайтесь странностей лексического разбора C++
  2. "Герб Саттер Решение сложных задач на С++". Задача 10.1. Инициализация. Часть 1
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru