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

Объединение двух map - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.91
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
11.01.2012, 14:01     Объединение двух map #1
Есть два map<string,string>. Есть ли какая нибудь функция, которая могла бы объединить два этих ассоциативных списка?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.01.2012, 14:03     Объединение двух map #2
std::merge
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
11.01.2012, 14:28  [ТС]     Объединение двух map #3
А можно пример? Попытался сделать так:
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
int _tmain(int argc, _TCHAR* argv[])
{
    
    map<string,string> m1;
    map<string,string> m2;
    map<string,string> m3;
    
    string s11("s11");
    string s12("s12");
    string s21("s21");
    string s22("s22");
    m1[s11]=s12;
    m1[s21]=s22;
    map<string,string>::iterator first1=m1.begin();
    map<string,string>::iterator last1=m1.end();
    map<string,string>::iterator first2=m2.begin();
    map<string,string>::iterator last2=m2.end();
 
    merge(first1,last1,first2,last2,m3.begin());
 
    for (first1=m3.begin();first1!=m3.end();++first1) {
        cout <<first1->first<<":"<<first1->second<<endl;
    }
 
    //ini f("1.ltx");
    //f.debug_print();
 
    getchar();
    return 0;
}
И получаю ошибку:
Ошибка

c:\mvs\vc\include\utility(260): error C2678: бинарный "=": не найден оператор, принимающий левый операнд типа "const std::string" (или приемлемое преобразование отсутствует)
1> c:\mvs\vc\include\xstring(707): может быть "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(std::basic_string<_Elem,_Traits,_Ax> &&)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\mvs\vc\include\xstring(762): или "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const std::basic_string<_Elem,_Traits,_Ax> &)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\mvs\vc\include\xstring(767): или "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(const _Elem *)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\mvs\vc\include\xstring(772): или "std::basic_string<_Elem,_Traits,_Ax> &std::basic_string<_Elem,_Traits,_Ax>::operator =(_Elem)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> при попытке сопоставить список аргументов "(const std::string, const std::basic_string<_Elem,_Traits,_Ax>)"
1> with
1> [
1> _Elem=char,
1> _Traits=std::char_traits<char>,
1> _Ax=std::allocator<char>
1> ]
1> c:\mvs\vc\include\utility(259): при компиляции функции-члена "std:air<_Ty1,_Ty2> &std:air<_Ty1,_Ty2>::operator =(std:air<_Ty1,_Ty2> &&)" класса шаблон
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=std::string
1> ]
1> c:\users\призрак\documents\visual studio 2010\projects\rpg\rpg\rpg.cpp(25): см. ссылку на создание экземпляров класса шаблон при компиляции "std:air<_Ty1,_Ty2>"
1> with
1> [
1> _Ty1=const std::string,
1> _Ty2=std::string
1> ]
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:01.35
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========

Jupiter
Каратель
Эксперт C++
6545 / 3965 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.01.2012, 14:53     Объединение двух map #4
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
#include <algorithm>
#include <string>
#include <utility>
#include <iostream>
#include <map>
 
struct print_pair {
    std::ostream& os;
    print_pair(std::ostream& s) : os(s) {}
    std::ostream& operator () (const std::pair<std::string, std::string>& p)
    {
        return (os << p.first << '.' << p.second << '\n');
    }
};
 
int main()
{
    std::map<std::string, std::string> a, b, c;
    a["cyberforum"] = "ru";
    a["cyberguru"] = "ru";    
    b["google"] = "com";
    b["dropbox"] = "com";
    std::merge(a.begin(), a.end(), b.begin(), b.end(), std::inserter(c, c.begin()));
    std::for_each(c.begin(), c.end(), print_pair(std::cout));
}
http://liveworkspace.org/code/706b75...ffe445e7314987
rus_phantom
6 / 6 / 1
Регистрация: 31.03.2011
Сообщений: 69
11.01.2012, 16:07  [ТС]     Объединение двух map #5
При добавлении всех библиотек:
ошибка

1>just_test.cpp(27): error C2039: inserter: не является членом "std"
1>just_test.cpp(27): error C3861: inserter: идентификатор не найден


Студия 2010
OstapBender
 Аватар для OstapBender
581 / 519 / 35
Регистрация: 22.03.2011
Сообщений: 1,585
11.01.2012, 17:06     Объединение двух map #6
rus_phantom, интересные дела. у меня всё в 10-ке компилится.
fasked
Эксперт C++
 Аватар для fasked
4925 / 2505 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
11.01.2012, 18:10     Объединение двух map #7
Цитата Сообщение от rus_phantom Посмотреть сообщение
При добавлении всех библиотек:
ошибка

1>just_test.cpp(27): error C2039: inserter: не является членом "std"
1>just_test.cpp(27): error C3861: inserter: идентификатор не найден


Студия 2010
#include <iterator> не помогает?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.01.2012, 15:12     Объединение двух map
Еще ссылки по теме:

C++ Объединение двух списков
Найти пересечение множеств ключей двух map C++
C++ Объединение двух if
C++ Определить объединение из двух полей. Первое поле - массив из двух байт, второе - слово
C++ Определить объединение из двух полей Первое поле - массив из двух байт, второе - слово

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

Или воспользуйтесь поиском по форуму:
Mr.X
Эксперт С++
 Аватар для Mr.X
3014 / 1670 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
13.01.2012, 15:12     Объединение двух map #8
Ну или можно фукцией-членом insert в std::map воспользоваться:
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
///////////////////////////////////////////////////////////////////////////////////////// 
#include <algorithm>
#include <string>
#include <utility>
#include <iostream>
#include <iterator>
#include <map>
///////////////////////////////////////////////////////////////////////////////////////// 
typedef std::map<std::string, std::string>  T_str_str_map;
///////////////////////////////////////////////////////////////////////////////////////// 
struct print_pair 
{
    std::ostream&  os;
 
    print_pair(std::ostream&  s) 
        : 
        os(s) 
    {}
 
    std::ostream& operator () (const T_str_str_map::value_type&  p)
    {
        return  (
                    os << p.first 
                       << '.' 
                       << p.second 
                       << '\n'
                );
    }
};
 
int main()
{
    T_str_str_map   a, 
                    b, 
                    c;
 
    a["cyberforum"  ]   = "ru";
    a["cyberguru"   ]   = "ru";    
    b["google"      ]   = "com";
    b["dropbox"     ]   = "com";
 
    c.insert
        (
            a.begin(),
            a.end()
        );
 
    c.insert
        (
            b.begin(),
            b.end()
        );
 
    //std::merge(a.begin(), a.end(), b.begin(), b.end(), std::inserter(c, c.begin()));
 
    std::for_each
        (
            c.begin     (), 
            c.end       (), 
            print_pair  (std::cout)
        );
}
Yandex
Объявления
13.01.2012, 15:12     Объединение двух map
Ответ Создать тему
Опции темы

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