Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.63
AnreyKazakov
Заблокирован
#1

Как передать контейнер map в функцию? - C++

28.09.2012, 19:45. Просмотров 2401. Ответов 3
Метки нет (Все метки)

Вопросов правда несколько, первый связан с конкретным примером.
Есть карта (заполненная), ключ - стринг, значение - вектор-стринг, необх доб значения в вектор, в функцию передается два итератора begin(),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
using namespace std;
typedef map<string,vector<string> > mapsv;
void add(mapsv::iterator ibegin,mapsv::iterator iend){
    
    //enter value
    string sname,ssurname;
    cout<<"Enter Surname and Name: ";
    cin>>sname>>ssurname;
    
    //create new map and search surname
    mapsv mps(ibegin,iend);cout<<"ok1";
    mapsv::iterator ifind=mps.find(ssurname);cout<<"ok2";
    
    //if the surname is found - create new vector
    //and search for the name to add new value
    bool key=0;cout<<"ok3";
    if(ifind!=iend){
        vector<string> vec(ifind->second);cout<<"ok4";/*ошибка*/
        for(vector<string>::iterator i=vec.begin();i!=vec.end();++i){
            cout<<"ok5";
            if(sname==*i){key=1;cout<<"ok6";break;}
            }
            
        if(key){cout<<"This name is already!";}else{
            vec.push_back(sname);cout<<"Add name "<<sname<<" in the group surname "<<ssurname<<endl;}
        }else{cout<<"This surname is already!";}
    }
Во вторых, в книжке написано (правда в разделе последовательных контейнеров было), что в функцию лучше передавать не сам объект (контейнер), а его итераторы... как вариант первый и последний.
Но, у меня чет так не получается =( отправил вроде итераторы, а чтобы добавить вектор, нужно найти функцией find ключ, как же я его найду, если у меня только два ключа в распоряжении? вот и создаю новый контейнер в функции, а это мне кажется то же самое, что его передать в функцию... Смысл теряется, только код раздувается... хех, в рифму получилось...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2012, 19:45
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как передать контейнер map в функцию? (C++):

Контейнер Map. Использование класса как ключ - C++
class A{ int X;}; class B{ public: int y;}; int main() { A objA; B objB; map&lt;A,B&gt; m; m.y=1; //kak? ...

Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std::map? - C++
Здравствуйте. Возможно ли создать контейнер std::map, в котором в качестве значения была бы ссылка на std map? Например: std::map...

контейнер map - C++
Помогите, пожалуйста дописать программу. Определите карту, в которой ключом является фамилия семьи, а значением вектор, который содержит...

Контейнер map - C++
Cоздать ассоциативный список имен (ключей), телефонов. Осуществить поиск по именам. Дополнить его данным адрес. Добавить возможности...

Контейнер map - C++
в программе используется ассоциативный массив, идентификатором которого являются символы проблема в том что появляется элемент с...

Контейнер map - C++
Здравствуйте, работаю с контейнером map, анализирую текст, получаю записи типа &quot;слово: число его появлений в тексте&quot;. Хотелось бы вывести...

3
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
28.09.2012, 19:58 #2
ifind и iend указывают на разные контейнеры
1
AnreyKazakov
Заблокирован
28.09.2012, 23:13  [ТС] #3
Спасибо, в этом и была ошибка, остался второй, более существенный вопрос:

Как лучше передовать данные контенера?

Вот допустим мне надо править этот map, а в нем еще и вектор, а векторе может еще кучу вложений всяких быть. Если передовать по ссылке только итераторы потом становиться очень неудобно работать, просто жуть... (хотя по учебнику предпочтительней передать итераторы), у меня код в разы раздулся, и я запарился, тот что сверху кстате неправильно я сделал =) , вот.
а если по ссылке передать весь контейнер, то все решается гораааздо быстрее. Да и потерь никаких, получается, что функция обращается к тому же объекту (она ничего не создает, поэтому потери производительности нет).

ИХМО лучше весь объект кидать, даже если не по ссылке.

Добавлено через 2 часа 18 минут
Ну, ответите, пож, сильные мира сего. Как вы передаете в функцию контейнер? Полностью или только итераторы? Или как-то еще? Или все от конкретной задачи зависит?
0
I.M.
565 / 548 / 5
Регистрация: 16.12.2011
Сообщений: 1,389
28.09.2012, 23:19 #4
От задачи зависит.
Передавайте, как удобнее. Что по ссылке, что итератором - на скорости не скажется
можно еще и итератор в тайпдеф добавить:
typedef map<string,vector<string> >::iterator mapsv_it;
1
28.09.2012, 23:19
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2012, 23:19
Привет! Вот еще темы с ответами:

Контейнер map - C++
Стоит задача реализовать контейнер map. Вопрос возникает при реализации итератора для этого контейнера. В итераторе должны быть реализованы...

Контейнер map ? - C++
Не совсем удается разобраться Не удается разобраться с ассоциативными контейнерами ! Как выглядит объявление функции в псевдокоде? Что...

Map контейнер сортировка - C++
Добрый день. Собственно необходимо вывести отсортированный мап контейнер по числу гласных в слове. Вводить строку и выводить мап...

Перевернуть контейнер map? - C++
Здравствуйте. Нужно отсортировать map по убыванию. Сделать что-то вроде прохода от map.end() до map.begin Спасибо.


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru