Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 04.03.2016, 14:56   #51
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию Пример работы с указателями в программах на C/C++

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
зачем нужен файл
Код:
#include <iterator>
?

каждый контейнер имеет в своем составе итератор же
Насколько я понимаю STL - нет.

Итератор - это отдельный от контейнера объект.

Аналогично, массив и указатель на элемент массива. Указатели на элемент массива можно порождать в любом количестве с любыми значениями. Однотипные указатели на пример в программах на C/C++ можно инициализировать адресами любых элементов любых массивов того же типа. Изменения массивов не будут влиять на значения указателей.
Возьму в кредит мильён по 100% годовых на сто лет.

Последний раз редактировалось ProBeginner; 05.03.2016 в 14:03.
ProBeginner вне форума
Старый 04.03.2016, 15:08   #52
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от ProBeginner Посмотреть сообщение
Указатели на элемент массива можно порождать в любом количестве с любыми значениями. Однотипные указатели можно инициализировать адресами любых элементов любых массивов того же типа. Изменения массивов не будут влиять на значения указателей.

это понятно.

когда мы объявляем итератор контейнера мы явно указываем область

видимости :: . значит класс итератор уже имеется в любом контейнере.

зачем тогда этот отдельный от контейнеров
Код:
#include <iterator>
честно говоря не вникал пока в это, но думаю от него толку нету.

___________________________________ __________


вот какая интересная штука выходит.

никогда не подключал
Код:
#include <iterator>
а функция advance работала как миленькая

Последний раз редактировалось RAFA91; 04.03.2016 в 15:36.
RAFA91 вне форума
Старый 04.03.2016, 15:36   #53
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
зачем тогда этот отдельный от контейнеров
Код:
#include <iterator>
Без понятия, возможно, связано с реализацией итераторов как "дружественных" объектов.
Т.е. шаблон итераторов разработан отдельно от контейнеров, но в шаблонах контейнеров итератор объявляется "дружественным".

Необходимость указания #include <iterator> для использования, возможно, связана с тем, что в заголовочных файлах самих контейнеров нет этого #include и к библиотеке контейнера итераторы подключены в файлах реализации. Т.е. модуль с итераторами к программе косвенно подключаться будет, но из-за отсутствия этого заголовка, трансляция главного модуля при использовании итераторов будет невозможной.
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 04.03.2016, 15:38   #54
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

Цитата:
Сообщение от ProBeginner Посмотреть сообщение
Без понятия, возможно, связано с реализацией итераторов как "дружественных" объектов.
Т.е. шаблон итераторов разработан отдельно от контейнеров, но в шаблонах контейнеров итератор объявляется "дружественным".
надо попробовать применять эти итераторы к другим типам массивов.

может в этом и есть фишка.
RAFA91 вне форума
Старый 04.03.2016, 16:00   #55
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
надо попробовать применять эти итераторы к другим типам массивов.

может в этом и есть фишка.
Не получится, итератор как и ссылка, м.б. инициализирован только элементом контейнера соответствующего типа. Соответствие д.б. на уровне типа элемента контейнера, и естественно тип контейнера.
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 04.03.2016, 16:39   #56
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

Удалите, чёт глюкнулся сервер
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 04.03.2016, 17:14   #57
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

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

Код:
int array[] = {5,4,3,2,1};
где вероятность большая что мы допустим ошибку

тут

Код:
sort(array,array+5);
или тут ?

Код:
sort(begin(array),end(array));
с помощью этой фигни можно определить к-во элементов в массиве

Код:
cout<<distance(begin(array),end(array));
RAFA91 вне форума
Старый 04.03.2016, 17:23   #58
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию

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

Например, в подобных случаях, практичнее создавать объект, который будет использовать контейнер для хранения данных, а методы обработки будут использовать соответствующие итераторы определённые внутри экземпляра.
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Старый 04.03.2016, 17:27   #59
RAFA91
Заблокирован
 
Регистрация: 06.02.2011
Сообщений: 1,999
По умолчанию

а Вас не смущает что это работает ?

Код:
sort(array,array+5);
вообще алгоритмы вроде требуют итераторы , а тут чистые указатели.
Цитата:
Сообщение от ProBeginner Посмотреть сообщение
Например, в подобных случаях, практичнее создавать объект, который будет использовать контейнер для хранения данных, а методы обработки будут использовать соответствующие итераторы определённые внутри экземпляра.
я это делал так (если обьект содержит в себе вектор)

Код:
void func(vector<int> :: iterator begin, vector<int> :: iterator end)
{}
хотя наверное логично написать так

Код:
void func(auto begin, auto end)
{}
___________________________________ _______

можно наверное еще так применять итераторы со стандартными типами.

Код:
int main() 
{
	int array[] = {5,4,3,2,1};

	for (auto it = begin(array); it != end(array); it++) cout<<*it<<" ";
	
	return 0;
}

Последний раз редактировалось RAFA91; 04.03.2016 в 17:58.
RAFA91 вне форума
Старый 04.03.2016, 17:58   #60
ProBeginner
Форумчанин
 
Регистрация: 22.02.2016
Сообщений: 145
По умолчанию Перегрузка алгоритма С++

Цитата:
Сообщение от RAFA91 Посмотреть сообщение
а Вас не смущает что это работает ?

Код:
sort(array,array+5);
вообще алгоритмы вроде требуют итераторы , а тут чистые указатели.
Не знаю, что и как сделано, но работать может по двум причинам
1) функция алгоритма перегружена для итераторов и для указателей
2) итератор может инициализироваться указателем (не уверен, что это реализовано в С++)
Возьму в кредит мильён по 100% годовых на сто лет.
ProBeginner вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Итератор для двусвязного списка Black_Dynamite Помощь студентам 0 07.11.2013 22:04
итератор set c++ Arrioh Помощь студентам 1 25.12.2012 16:01
Итератор списка по значению Link0 Общие вопросы по Java, Java SE, Kotlin 0 21.11.2010 14:02