Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.93/29: Рейтинг темы: голосов - 29, средняя оценка - 4.93
Заблокирован
1

Нужно ли передавать итератор в функцию по ссылке?

09.02.2016, 17:49. Показов 5988. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день !

Итератор это тот же обьект но с поведением указателя.

Нужно ли его в функцию передавать как ссылку ?

C++
1
void func(list<int> :: iterator it_begin, list<int> :: iterator it_end)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#include <list>
using namespace std;
 
void func(list<int> :: iterator it_begin, list<int> :: iterator it_end)
{
    list<int> l(it_begin,it_end);
    list<int> :: iterator it = l.begin();
    while (it != l.end())
    {
        cout<<*it<<" ";
        it++;
    }
    
}
 
int main() 
{
    list<int> l;
    list<int> :: iterator it_begin,it_end;
    for (int i=0;i<10;i++) l.push_back(i);
    it_begin = l.begin();
    it_end = it_begin;
    advance(it_end,7);
    func(it_begin,it_end);
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2016, 17:49
Ответы с готовыми решениями:

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

Как передавать объекты в функцию по ссылке, как в C++?
Здравствуйте. После программирования на C++ решил попробовать на java написать мобильное...

Можно ли как-то передавать в функцию то поле, какое нужно печатать
Доброго времени суток, форумчане. Имеется такая конструкция. void print() { for (int j = 0; j &lt;...

Что значит Handle hf? Что в эту функцию нужно передавать
мне нужно создать функцию Node * ReadNode(HANDLE hf); (Node это структура) Так вот вопрос в том...

22
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
09.02.2016, 19:44 2
RAFA91, Зависит от того, что хотим сделать с этим итератором. В твоем случае нет.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
09.02.2016, 20:10 3
Цитата Сообщение от RAFA91 Посмотреть сообщение
Нужно ли его в функцию передавать как ссылку ?
Это не обязательно, но желательно.
Мы не знаем сколько данных содержит в себе итератор, поэтому проще передать ссылку, нежели скопировать его.
1
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
10.02.2016, 07:50 4
В stl все передается по значению в том числе и итераторы. Т.е. они оптимизированны для передачи по значению. Не стоит отходить от этой славной традиции. Проверьте сами:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <string>
#include <vector>
#include <deque>
#include <list>
#include <set>
#include <set>
#include <map>
int main()
{
    std::cout << "sizeof(std::string::iterator) is "        << sizeof(std::string::iterator) << std::endl;
    std::cout << "sizeof(std::vector<int>::iterator) is "   << sizeof(std::vector<int>::iterator) << std::endl;
    std::cout << "sizeof(std::deque<int>::iterator) is "    << sizeof(std::deque<int>::iterator) << std::endl;
    std::cout << "sizeof(std::list<int>::iterator) is "     << sizeof(std::list<int>::iterator) << std::endl;
    std::cout << "sizeof(std::string::iterator) is "        << sizeof(std::set<int>::iterator) << std::endl;
    std::cout << "sizeof(std::set<int>::iterator) is "      << sizeof(std::multiset<int>::iterator) << std::endl;
    std::cout << "sizeof(std::map<int, int>::iterator) is " << sizeof(std::map<int, int>::iterator) << std::endl;
    std::cout << "sizeof(std::multimap<int, int>::iterator) is " << sizeof(std::multimap<int, int>::iterator) << std::endl;
}
Т.е. только для дека размер итератора отличается от размера указателя.
Но в целом ForEveR прав. Все зависит от того, что вы хотите сделать с итератором.
1
Заблокирован
10.02.2016, 14:12  [ТС] 5
Цитата Сообщение от Ilot Посмотреть сообщение
В stl все передается по значению
на сколько я знаю по ссылке. на кой создавать копию списка который содержит в себе миллион обьектов весом по

100 байт каждый ?

и кому будет от этого плохо если передать по ссылке список в функцию?
Цитата Сообщение от castaway Посмотреть сообщение
Мы не знаем сколько данных содержит в себе итератор
а какие он может содержать данные ? данные содержит список а итератор это тот же указатель

Добавлено через 5 минут
Цитата Сообщение от castaway Посмотреть сообщение
Мы не знаем сколько данных содержит в себе итератор
а какие он может содержать данные ? данные содержит список а итератор это тот же указатель
Цитата Сообщение от Ilot Посмотреть сообщение
Все зависит от того, что вы хотите сделать с итератором.

а что с ним можно делать кроме как иметь доступ к элементам контейнера
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.02.2016, 14:25 6
RAFA91, В алгоритмы итератор передается по значению в STL. Посмотрите на сигнатуру любого алгоритма.
Цитата Сообщение от RAFA91 Посмотреть сообщение
а какие он может содержать данные ? данные содержит список а итератор это тот же указатель
Итератор может хранить больше данных, нежели просто указатель.
Цитата Сообщение от RAFA91 Посмотреть сообщение
а что с ним можно делать кроме как иметь доступ к элементам контейнера
Да сдвинуть например: advance
1
Заблокирован
10.02.2016, 14:36  [ТС] 7
вот этот пример демонстрирует что при передачи списка по значению будет создана копия списка и затрачена на

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

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
// ssssss.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <list>
#include <iostream>
 
using namespace std;
 
class A
{
public:
    A() {cout<<"constructor "<<this<<endl;}
    ~A() {cout<<"destructor "<<this<<endl;}
    A(const A &rhs) {cout<<"constructor copy "<<this<<" "<<&rhs<<endl;}
};
 
void func(list <A> l)
{
}
 
 
int _tmain(int argc, _TCHAR* argv[])
{
    list <A> l(3);
    cout<<"************** "<<endl;
    func(l);
    cout<<"_____________________________ "<<endl;
    return 0;
}
Миниатюры
Нужно ли передавать итератор в функцию по ссылке?  
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.02.2016, 14:36 8
Цитата Сообщение от RAFA91 Посмотреть сообщение
а итератор это тот же указатель
Откуда такая глупая информация у вас в голове?
1
Заблокирован
10.02.2016, 14:38  [ТС] 9
Цитата Сообщение от castaway Посмотреть сообщение
Откуда такая информация
я про его поведение а не техническую реализацию
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.02.2016, 14:44 10
RAFA91, Очевидно, что если вы принимаете контейнер по значению будет копия. Но итератор это не контейнер и расходы на копию достаточно малы.
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.02.2016, 14:45 11
Цитата Сообщение от castaway Посмотреть сообщение
Мы не знаем сколько данных содержит в себе итератор
Цитата Сообщение от RAFA91 Посмотреть сообщение
а какие он может содержать данные ? данные содержит список а итератор это тот же указатель
Цитата Сообщение от RAFA91 Посмотреть сообщение
я про его поведение а не техническую реализацию
А тебя не смущает то, о чём говорил я изначально?
1
88 / 84 / 31
Регистрация: 18.11.2013
Сообщений: 390
10.02.2016, 14:50 12
Цитата Сообщение от castaway Посмотреть сообщение
Мы не знаем сколько данных содержит в себе итератор, поэтому проще передать ссылку, нежели скопировать его.
если вы боитесь за то, что может выделиться много памяти, то за это не стоит бояться, лучше передавать по значению, чтобы создавалась копия, т.к. в случае передачи по ссылке мы рискуем изменить сам итератор, и потом будут вопросы типа почему такое не работает:

C++
1
2
3
4
5
6
7
vector<int> mas;
auto start = mas.begin();
auto end = mas.end();
sort(start,end);
cout << *start;
// почему не выводит первый элемент?
// подразумеваем, что sort написан автором этой темы, и итераторы передаются по ссылке
Добавлено через 2 минуты
конечно если у вас что-то типа
C++
1
2
3
4
auto iter = mas.begin();
to_end(iter);
// iter == mas.end()
и функция должна изменять итератор, то лучше передавать по ссылке, или по указателю, как это делает scanf("%d", &t); указатель всего 4\8байт, так что переполнения не будет
1
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
10.02.2016, 14:54 13
Цитата Сообщение от Krock21rus Посмотреть сообщение
если вы боитесь за то, что может выделиться много памяти, то за это не стоит бояться, лучше передавать по значению, чтобы создавалась копия, т.к. в случае передачи по ссылке мы рискуем изменить сам итератор
В таком случае надо чётко понимать что ты делаешь, и так (как сказали вы) можно сказать про любой объект, а не только итератор.
1
Заблокирован
10.02.2016, 15:08  [ТС] 14
Цитата Сообщение от ForEveR Посмотреть сообщение
RAFA91, Очевидно, что если вы принимаете контейнер по значению будет копия. Но итератор это не контейнер и расходы на копию достаточно малы.
цитируя
Цитата Сообщение от Ilot Посмотреть сообщение
В stl все передается по значению в том числе и итераторы.
Цитата Сообщение от Krock21rus Посмотреть сообщение
т.к. в случае передачи по ссылке мы рискуем изменить сам итератор,
а как на счет константа ?


мы же можем сделать обьект константным .
0
Эксперт по математике/физикеЭксперт С++
2048 / 1366 / 395
Регистрация: 16.05.2013
Сообщений: 3,506
Записей в блоге: 6
10.02.2016, 15:12 15
Цитата Сообщение от RAFA91 Посмотреть сообщение
на сколько я знаю по ссылке. на кой создавать копию списка который содержит в себе миллион обьектов весом по
100 байт каждый ?
Потому, что вы не понимаете о чем вам говорят.
3
Заблокирован
10.02.2016, 15:14  [ТС] 16
из этой записи и понял

Цитата Сообщение от Ilot Посмотреть сообщение
В stl все передается по значению в том числе и итераторы.
не знаю что вы подразумевали под словом все
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
10.02.2016, 16:21 17
RAFA91, Вы много алгоритмов видели в STL, где работа идет по контейнеру, а не по итераторам? Под все подразумевалось: итераторы, функторы, что там еще получают STL алгоритмы.
0
Заблокирован
11.02.2016, 15:17  [ТС] 18
Алгоритмы да - только итераторы.

готов предположить что по значению.

Добавлено через 22 часа 47 минут
Цитата Сообщение от RAFA91 Посмотреть сообщение
готов предположить что по значению.
кроме advance.
0
70 / 47 / 5
Регистрация: 10.01.2017
Сообщений: 1,849
24.08.2023, 22:05 19
Цитата Сообщение от ForEveR Посмотреть сообщение
RAFA91, Зависит от того, что хотим сделать с этим итератором. В твоем случае нет.
А для каких случаев желательно предавать итератор по ссылке ? Что нужно хотеть сделать с итератором, чтобы была необходимость передать его по ссылке ?
0
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,285
24.08.2023, 22:24 20
Цитата Сообщение от Optimus11 Посмотреть сообщение
Что нужно хотеть сделать с итератором, чтобы была необходимость передать его по ссылке ?
Изменить.
0
24.08.2023, 22:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
24.08.2023, 22:24
Помогаю со студенческими работами здесь

Можно ли передавать событие по ссылке
Вопрос скорей риторический. У меня не заработала такая схема: class A { private Action...

Как передавать массив по ссылке, чтобы не работала копия массива?
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; using namespace std; int Min (int a,const int size);...

Зачем при перегрузке инкремента дружественной функцией передавать аргумент по ссылке?
В программе реализованы два инкремента: префиксный и постфиксный. Зачем в функции передавать...

Как передавать указатель на функцию в функцию для ее выполнения?
Здравствуйте! Вопрос следующий: Как передавать указатель на функцию в функцию для ее...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru