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

Ассоциативный массив - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 22, средняя оценка - 4.64
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
11.10.2013, 16:10     Ассоциативный массив #1
Простите за нубский вопрос, но гугл мне не помог(

Нужно реализовать список радиочастот и названий радио. Получается нужен ассоциативный массив. Я выбрал map.
Все бы ничего, но ключ масива должен быть double (т.к. это частота), а значиние строка (название радио).
Вот здесь и возник ступор. Приведу пример кода:

C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
#include <iomanip>
#include <map>
 
using namespace std;
 
map<double, string> radioMap;
radioMap.insert(pair(103.6, "Radio Roks FM"));
Visual Studio тыкает носом сюда:
C++
1
radioMap.insert(pair(103.6, "Radio Roks FM"));
и говорит:
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
и еще:
IntelliSense: это объявление не содержит класс хранения или спецификатор типа
Как с этим бороться или предложите другое, подходящее решение.
Спасибо! =)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
11.10.2013, 16:10     Ассоциативный массив
Посмотрите здесь:

C++ ассоциативный массив
C++ Ассоциативный массив в С++ (типо пэхапе)
динамический ассоциативный массив C++
Ассоциативный массив C++
Ассоциативный массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.10.2013, 16:12     Ассоциативный массив #2
Цитата Сообщение от gund Посмотреть сообщение
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
хоть убей не вижу тут "->"
кинь побольше кода, может ошибка не тут
zitxbit
Master C/C++
 Аватар для zitxbit
86 / 738 / 75
Регистрация: 11.04.2012
Сообщений: 971
11.10.2013, 16:13     Ассоциативный массив #3
Попробуйте вот-так:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <string>
#include <iomanip>
#include <map>
 
using namespace std;
 
map<double, string> radioMap;
radioMap.insert(pair<double,string>(103.6, "Radio Roks FM"));
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 16:18     Ассоциативный массив #4
Цитата Сообщение от gund Посмотреть сообщение
Все бы ничего, но ключ масива должен быть double
std::ratio же, ну или pair двух целых
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.10.2013, 16:22     Ассоциативный массив #5
Цитата Сообщение от gund Посмотреть сообщение
C++
1
pair(103.6, "Radio Roks FM")
C++
1
make_pair(103.6, "Radio Roks FM")
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
11.10.2013, 18:19  [ТС]     Ассоциативный массив #6
Трабл вот в чем, мне нужно юзать этот массив в классе "Радио", соответственно я решил объявить его в заголовочном файле этого класса (где собственно и была ошибка). Но интереса ради я поместил этот код:
C++
1
2
map<double, string> radioMap;
radioMap.insert(make_pair(103.6, "Radio Roks FM"));
в функцию main() и ошибки не стало (выходит такие манипуляции разрешены только в теле функции/метода), но мне такой вариант уж точно не катит =(

Кто вкурсе как решить "такое"? =)
Возможно придется инициализировать этот массив конструктором класса "Радио", но это уже крайний способ, если никто не предложит.

Спасибо)

Добавлено через 12 минут
Пробовал в конструкторе запилить, тоже неудача, в коде:
C++
1
2
// Init Radio Map List
radioMap.insert(pair<double, string>(103.6, "Radio Roks FM"));
Таккая вот хрень:
Ошибка 1 error LNK2005: "class std::map<double,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<double>,class std::allocator<struct std::pair<double const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > radioMap" (?radioMap@@3V?$map@NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$less@N@2@V?$allocator@U?$pair@$$CBNV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@@2@@std@@A) уже определен в laba1.obj C:\Users\Алексей\Documents\427 ПОМ\OOP\laba1\laba1\Radio.obj laba1
И вместо pair<double, string> make_pair(), тоже:
Ошибка 1 error LNK2005: "class std::map<double,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,struct std::less<double>,class std::allocator<struct std::pair<double const ,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > > radioMap" (?radioMap@@3V?$map@NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@U?$less@N@2@V?$allocator@U?$pair@$$CBNV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@@2@@std@@A) уже определен в laba1.obj C:\Users\Алексей\Documents\427 ПОМ\OOP\laba1\laba1\Radio.obj laba1
Ужас какой-то...
Как можно исправить уже голову сломал =)
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
11.10.2013, 18:26     Ассоциативный массив #7
можно статически инициализировать map, смотря какой стандарт C++ используешь
если не C++0x, то можно так

C++
1
2
3
4
5
6
7
8
std::pair<double, std::string> map_data[] = {
    std::make_pair(1, "a"),
    std::make_pair(2, "b"),
    std::make_pair(3, "c")
};
 
std::map<double, std::string> radioMap(map_data,
    map_data + sizeof map_data / sizeof map_data[0]);
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
11.10.2013, 21:55  [ТС]     Ассоциативный массив #8
Попробовал Вашим способом, тоже ошибка.
Вот код:

C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>
#include <iomanip>
#include <map>
 
using namespace std;
 
pair<double, string> radioList[] = {
    make_pair(103.6, "Radio Roks FM")
};
map<double, string> radioMap(radioList, radioList + sizeof radioList / sizeof radioList[0]);
Вот текст ошибки:

Ошибка 1 error LNK2005: "struct std::pair<double,class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > * radioList" (?radioList@@3PAU?$pair@NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@std@@A) уже определен в laba1.obj C:\Users\Алексей\Documents\427 ПОМ\OOP\laba1\laba1\Radio.obj laba1
Такое впечатление что библиотека Map просто нерабочая...
Хотя кто его знает =)
Но решения я не нашел пока, кто то еще может имеет идеи по этому поводу?
Спасибо!
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.10.2013, 22:06     Ассоциативный массив #9
Цитата Сообщение от gund Посмотреть сообщение
Вот код:
Это заголовочный файл? Похоже на нарушение ODR. Определение должно быть одно, в одном файле c исходным кодом. В заголовочных - только объявление.
В заголовочных файлах:
C++
1
extern map<double, string> radioMap;
В исходнике:
C++
1
2
3
4
5
6
7
8
9
namespace {
 
pair<double, string> radioList[] = {
    make_pair(103.6, "Radio Roks FM")
};
 
}
 
map<double, string> radioMap(radioList, radioList + sizeof radioList / sizeof radioList[0]);
Хотя я и не понял, зачем эта глобальная переменная...
gund
18 / 18 / 0
Регистрация: 05.05.2013
Сообщений: 88
11.10.2013, 22:20  [ТС]     Ассоциативный массив #10
gray_fox, Спасибо, это то что нужно и работает =)

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

Всем спасибо за оказанную помощь. =)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.10.2013, 22:25     Ассоциативный массив
Еще ссылки по теме:

C++ Ассоциативный массив
C++ Ассоциативный массив на префиксных деревьях
C++ Ассоциативный массив своими руками

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

Или воспользуйтесь поиском по форуму:
gray_fox
What a waste!
 Аватар для gray_fox
1244 / 1127 / 53
Регистрация: 21.04.2012
Сообщений: 2,350
Завершенные тесты: 3
11.10.2013, 22:25     Ассоциативный массив #11
Цитата Сообщение от gund Посмотреть сообщение
как константа
Она сейчас не константа по факту; добавь const, по желанию)
Yandex
Объявления
11.10.2013, 22:25     Ассоциативный массив
Ответ Создать тему
Опции темы

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