Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295

Ассоциативные массивы <map>

27.12.2018, 18:41. Показов 2369. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, возникла необходимость проверить каждый элемент одного вектора с каждым элементом другого вектора и если совпадение было найдено заполнить ассоциативный массив <map> по правилу (элемент массива, "ключевое слово"), получился следующий код:
C++
1
2
map <string, string> tokenstable; 
vector<string> vct;
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void token_stable()
{
    vector <string> keyword = { "begin","end"}; 
        for (int i = 0; i < vct.size(); i++)
        {
            for (int j = 0; j < keyword.size(); i++)
            {
                if (vct[i] == keyword[j])
                    tokenstable.emplace(vct[i], "Ключевое слово");
                else j++;
            }
            i++;
        }
}
Вопрос в следующем, как вывести этот ассоциативный массив в консоль?

Добавлено через 1 час 28 минут
UPD 10 и 12 строки - ошибка, их можно вычеркнуть
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.12.2018, 18:41
Ответы с готовыми решениями:

Множества, ассоциативные массивы, алгоритмы
Текстовый файл содержит координаты точки и угол наклона прямой, проходящей через эту точку. Прочитать данную информацию. Проверить и выдать...

Стандартная библиотека: множества, ассоциативные массивы, алгоритмы
Текстовый файл содержит следующую информацию: координату точки и угол наклона прямой, проходящей через эту точку. Прочитать данную...

Объяснить (с примерами кода) как работают ассоциативные массивы
Всем привет. В интернете не много информации про эти массивы. Можно небольшой пример как допустим по индексу 'a' записать 'b' по 'b'...

9
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
27.12.2018, 18:43
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
как вывести <...> ассоциативный массив в консоль?
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include <iostream>
#include <map>
 
using namespace std;
 
int main() {
    map<int, int> mp;
    for (int i = 1; i <= 10; ++i)
        mp[i] = i * i;
    for (const auto &el : mp)
        cout << el.first << " : " << el.second << endl;
}
Надеюсь, код понятен без комментариев.
0
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
27.12.2018, 19:39  [ТС]
L0M, вполне понятно, пара вопросов еще.
Я правильно заполняю ассоциативный массив?
C++
1
tokenstable.emplace(vct[i], "Ключевое слово");
При попытке вывести выдается ошибка
0
9 / 9 / 0
Регистрация: 22.12.2017
Сообщений: 295
27.12.2018, 19:43  [ТС]
Скрин ошибки
Миниатюры
Ассоциативные массивы <map>  
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
27.12.2018, 23:24
Encrypted1010, во-первых, я не очень понимаю что делают куски кода, которые вы показали.
C++
1
tokenstable.emplace(vct[i], "Ключевое слово");
Формально, я особой ереси в этом не вижу, за исключением того момента, что если в vct[i] переменная i выходит за границу вектора, то результат будет неопределённым. И что при этом попадёт в мапу, сказать трудно.

Во-вторых, судя по скрину ошибки, вы пытаетесь получить значение элемента за пределами вектора. Вектора, Карл! А вы пишете, что "при попытке вывести", т.е., как я понимаю, "вывести на консоль". Либо вы получаете эту ошибку не "при попытке вывести", а при заполнении мапы, тем более, что у вас как-то подозрительно много в коде операторов i++, либо вы пытаетесь вывести какой-то вектор, а не мапу. Это я уже сказать не могу, поскольку код вывода мапы вы не показали.

В-третьих, при получении ошибки, нажать на кнопочку Повтор и посмотреть под отладчиком не пробовали?
0
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
28.12.2018, 09:28
Цитата Сообщение от L0M Посмотреть сообщение
Надеюсь, код понятен без комментариев.
А как прокомментировать это:
Цитата Сообщение от L0M Посмотреть сообщение
for (const auto &el : mp)
???

Может всё таки нужно так:
C++
1
2
 for (auto it=mp.begin(); it!=mp.end(); it++)
        cout << (*it).first << " : " << (*it).second << endl;
0
 Аватар для Avaddon74
571 / 353 / 133
Регистрация: 15.09.2017
Сообщений: 1,239
28.12.2018, 09:52
Цитата Сообщение от LVV Посмотреть сообщение
А как прокомментировать это:
Цитата Сообщение от L0M Посмотреть сообщение
for (const auto &el : mp)
???
Цикл Range-based for
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9006 / 4707 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
28.12.2018, 10:11
Цитата Сообщение от Encrypted1010 Посмотреть сообщение
возникла необходимость проверить каждый элемент одного вектора с каждым элементом другого вектора и если совпадение было найдено
Encrypted1010, сравнение на равенство строк возвращает true если строки идентичны. Другие методы могут игнорировать регистр символов и пр., но обычный оператор сравнения (если traits не ковырять) проверяет посимвольную идентичность.
Вопрос: Если строка является ключом, то казалось бы стоит применить набор/множество std::set<std::string>? Иными словами, - Зачем карта где ключ всегда совпадает со значением? Лучше бы значением был счётчик совпадений, например.
Возможно, я не понял Вашего вопроса.
Вообще, - изначально set лучше вектора для поиска, если говорить и об исходных контейнерах. А поиск по векторам - лучше, - по сортированным и методами вроде lower_bound и т.п.
0
Мозгоправ
 Аватар для L0M
1745 / 1039 / 468
Регистрация: 01.10.2018
Сообщений: 2,138
Записей в блоге: 2
28.12.2018, 11:05
LVV, тормозите, сударь, дико тормозите.

Если с range-based for я ещё могу понять... ну отстали немного от жизни, то с конструкцией (*it).first - совершенно не понимаю. Оно, конечно работает, но для таких случаев описан специальный синтаксис ещё у Кернигана и Ритчи почти полвека назад.
1
 Аватар для LVV
155 / 137 / 46
Регистрация: 15.02.2010
Сообщений: 750
29.12.2018, 05:23
Цитата Сообщение от L0M Посмотреть сообщение
(*it).first - совершенно не понимаю
Вы имеете ввиду синтаксис it->first вместо (*it).first ?
Ну, просто, хотел визуально быть близок к Вашему, LOM, стилю:
Цитата Сообщение от L0M Посмотреть сообщение
cout << el.first << " : " << el.second << endl;
А в остальном, Вы правы: предпочитаю более понятный код более модному... особенно в разделе "С++ для начинающих".
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
29.12.2018, 05:23
Помогаю со студенческими работами здесь

Ассоциативные массивы
Ребят, понадобилось создать ассоциативный массив, нужен пример кода, дальше разберусь. Массив должен быть вида: &quot;код...

Ассоциативные массивы
Здравствуйте, помогите, пожалуйста! Есть задание: написать скрипт вычисляющий стоимость квартиры в соответствии с введенными...

Ассоциативные массивы
В этом коде выводится имя, которое было введено в поле ввода в виде hello $name. При первом запуске страница ошибка, что в принципе...

Ассоциативные массивы
Здравствуйте. Вот код из книги Котерова: $A = array( 'ресторан' =&gt; 'Китайский сюрприз', 'девиз' =&gt; 'Nosce te...

Ассоциативные массивы
Как задать массив через Array(), не знаю, можно ли так в JS, но в PHP это делается так: $a=array(&quot;key&quot;=&gt;&quot;val&quot;,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru