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

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

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

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

11.10.2013, 16:10. Просмотров 3391. Ответов 10
Метки нет (Все метки)

Простите за нубский вопрос, но гугл мне не помог(

Нужно реализовать список радиочастот и названий радио. Получается нужен ассоциативный массив. Я выбрал 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++
Задача будет такая: с платы (AFDX) считываются данные в таком формате: индекс 9 байт и сами данные 1500байт. &quot;Индекс&quot; на самом деле в себя...

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

Ассоциативный массив - C++
Добрый день. Нужно заполнить map &lt;char,vector&lt;int&gt; &gt; из файла, содержание которого: 1 f 2 g 5 c Вот моя программа #include...

Ассоциативный массив - C++
Пытаюсь написать что-то вроде ассоциативного массива, но проверка показывает, что не всё правильно добавляется (метод Add). void...

Ассоциативный массив - C++
Добрый день. Есть массив map&lt;char,vector&lt;bool&gt; &gt; table; Как пройтись по этому массиву итератором, чтобы вывести содержимое на экран? ...

динамический ассоциативный массив - C++
Подскажите как организовать ассоциативный массив в виде динамической структуры для класса template &lt;class T&gt; class el { ...

Ассоциативный массив с несколькими индексами - C++
Есть структура: struct DATA { int key1; int key2; char *pData; }; Необходим массив таких структур с быстрым...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 1
11.10.2013, 16:12     Ассоциативный массив #2
Цитата Сообщение от gund Посмотреть сообщение
error C2143: синтаксическая ошибка: отсутствие ";" перед "->"
хоть убей не вижу тут "->"
кинь побольше кода, может ошибка не тут
zitxbit
Master C/C++
87 / 739 / 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
Каратель
Эксперт С++
6552 / 3972 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
11.10.2013, 16:18     Ассоциативный массив #4
Цитата Сообщение от gund Посмотреть сообщение
Все бы ничего, но ключ масива должен быть double
std::ratio же, ну или pair двух целых
gray_fox
What a waste!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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
622 / 326 / 34
Регистрация: 06.07.2013
Сообщений: 1,054
Завершенные тесты: 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!
1411 / 1140 / 55
Регистрация: 21.04.2012
Сообщений: 2,362
Завершенные тесты: 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++
Подскажите, существует ли контейнер или готовый класс, типа map, но основанный на префиксных деревьях? Нужно для быстрого поиска ключа. Я...

Ассоциативный массив своими руками - C++
Подскажите, пожалуйста, как реализовать такую конструкцию: array = 324;

ассоциативный массив map c двумерным массивом - C++
Искал информацию в интернете но безрезультатно. Необходимо сделать ассоциативный массив с со строковым ключом и двумерным массивом 3х3 в...

Создать ассоциативный массив фиксированного размера - C++
Нужно создать массив, который вел бы себя следующим образом 1. Массив должен быть фиксированного размера 2. Ключи для доступа к...


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

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

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