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

Как в строке найти слово, совпадающее с ключом контейнера map

09.05.2020, 02:46. Показов 984. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как сравнить слово из строки на соответствие с одним из ключей map'а ?
Нужно не конкретное слово проверять, а что бы проверялась вся строка
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.05.2020, 02:46
Ответы с готовыми решениями:

Вывести совпадающее слово в строке
Вам дана строка S, состоящая только из пробелов и строчных латинских букв. Строка представляет из себя предложение, т.е. несколько слов,...

Имеется ли в строке слово совпадающее с первым словом?
Дана строка, слова в которой разделены пробелами. верно ли что в строке имеется еще одно слово совпадающее с первым словом строки

Из каждого элемента контейнера map вычесть среднее арифметическое контейнера
Контейнер map, тип элементов Int 3.Из каждого элемента вычесть среднее арифметическое контейнера

12
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,239
09.05.2020, 04:27
Цитата Сообщение от LudeiViktorovi4 Посмотреть сообщение
Как сравнить слово из строки на соответствие с одним из ключей map'а ?
Нужно не конкретное слово проверять, а что бы проверялась вся строка
Что такое "проверялась вся строка"? Какого рода результат вы хотите получить от этой проверки?

В любом случае, это значит, что вам нужно ручками пройтись по словам в строке и проверить каждое слово по отдельности. Никакого волшебного "проверялась вся строка" тут быть не может, кроме разве что готового решения, которое пройдется по словам за вас.
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
09.05.2020, 05:20
TheCalligrapher, может ТС имел ввиду нечто такое?
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <map>
#include <cstring>
 
 
int main() {
    std::map<const char *, const char *> testMap = {{"source_word", "word"}};
    const char *testStr = "bla bla bla blabla source_word";
    std::cout << ((std::strstr(testStr, testMap.find("source_word")->first)) ? 1 : 0);
    return 0;
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
13177 / 6813 / 1821
Регистрация: 18.10.2014
Сообщений: 17,239
09.05.2020, 06:27
Цитата Сообщение от Qwerty_Wasd Посмотреть сообщение
может ТС имел ввиду нечто такое?
Я, честно говоря, в упор не понимаю, что вы этим пытались сделать.

Во-первых, std::map<const char *, const char *> - это почти всегда бессмыслица, ибо оно будет сравнивать указатели.

Во-вторых, выражение

C++
1
testMap.find("source_word")->first
либо вернет вам все то же "source_word", либо тупо упадет. Какой в тогда смысл в testMap.find???
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
09.05.2020, 07:06
TheCalligrapher,
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
почти всегда бессмыслица, ибо оно будет сравнивать указатели
здесь поподробнее пожалуйста.
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
либо тупо упадет.
ну да Вы правы, проверку я не сделал.
C++
1
(testMap.count("source_word") > 0 && (std::strstr(testStr, testMap.find("source_word")->first))
Но я и не собирался предоставлять ТС ответ. Вопрос был к Вам как к профи. И привел мнимый пример.

И упреждая возможный ход диалога - не надо привязываться к мнимому примеру. Думаю ТС не совсем потерян, и сможет итерационно пройтись по мапе.
Смысл моего вопроса к Вам был в
C++
1
std::strstr
То есть чем не угодило?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
09.05.2020, 07:54
Qwerty_Wasd, компаратор map в вашем коде будет сравнивать адреса, а не содержимое строк. Поэтому ваш код не может гарантировать ожидаемое вами (или ТС) поведение. Совершенно очевидно, что у литерала "source_word" в 7 строке может быть совершенно другой адрес нежели у литерала в "source_word" в 9-й. Даже если в вашем конкретном случае компилятор оптимизировал расположение литералов в памяти и "схлопнул" идентичные строки в одну и вы получили ожидаемое поведение, то это поведение не гарантируется. Не говоря уж о том, что если такие строки будут задаваться не литералами, то работать не будет вообще никогда.

Добавлено через 36 минут
Qwerty_Wasd, т.е. тут надо либо использовать std::string или что-то подобное, либо написать компаратор для этого случая, в котором делать сравнение содержимого строк по указателям.
1
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
09.05.2020, 08:04
DrOffset,

Что-то вроде?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <map>
#include <cstring>
 
 
int main() {
    std::map<std::string, std::string> testMap = {{"source_word", "word"}};
    std::string testStr = "bla bla bla blabla source_word";
    
    for(auto it = testMap.begin(); it != testMap.end(); ++it)
    {
        if (std::strstr(testStr.c_str(), (it->first).c_str()))
            std::cout << "Gotcha!";
        
    }
    
    testMap.clear();
    return 0;
}
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
09.05.2020, 08:16
Цитата Сообщение от Qwerty_Wasd Посмотреть сообщение
Что-то вроде?
Что-то вроде, да. Только map в том случае как-то не особо полезен.

Я тоже думаю, что лучше ТС пояснить подробнее чего именно он хотел добиться.
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
09.05.2020, 08:20
DrOffset,
Цитата Сообщение от DrOffset Посмотреть сообщение
Только map в том случае как-то не особо полезен.
Ну ТС озвучил - я использовал.

Еще вопрос на злобу темы -
Здесь
C++
1
std::strstr(testStr.c_str(), (it->first).c_str())
я по сути также использовал указатели на строки Си-вида, что вернул метод. В чем разница? В смысле с инициализацией?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
09.05.2020, 08:25
Qwerty_Wasd, strstr работает через эти указатели с содержимым строки. В этом и разница, надо полагать
std::map тоже может так делать, если вы дадите ему адекватный компаратор.
0
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
09.05.2020, 08:30
DrOffset, предполагаю что начинаю вызывать раздражение, и тем не менее, пока есть возможность, позвольте потрясти Вас на знания. Очень уж я до них жаден

К слову
Цитата Сообщение от DrOffset Посмотреть сообщение
std::map тоже может так делать, если вы дадите ему адекватный компаратор.
не совсем понял. Что именно может делать?

Вменяемый компаратор думаю присутствует в реализации некоторых методов - find, count и т.д.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,818
09.05.2020, 08:41
Цитата Сообщение от Qwerty_Wasd Посмотреть сообщение
Вменяемый компаратор думаю присутствует в реализации некоторых методов - find, count и т.д.
Вменяемость в данном случае понятие относительное. И очевидно, что если вы хотите, чтобы сравнивались строки, но используете для этого реализацию "по умолчанию", которая сравнивает указатели, то эта реализация "по умолчанию" не является "вменяемой" для вашей задачи. Естественно, она в этом не виновата. Так же как не виноват молоток, если пользуясь им кто-то зарядил себе по пальцам.

С вашего позволения, ваш первый пример мог бы выглядеть так,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <map>
#include <cstring>
 
struct LessCStr {
    bool operator()(const char * lp, const char * rp) const {
        return std::strcmp(lp, rp) < 0;
    }
};
 
int main() {
    std::map<const char *, const char *, LessCStr> testMap = {{"source_word", "word"}};
    const char *testStr = "bla bla bla blabla source_word";
    std::cout << ((std::strstr(testStr, testMap.find("source_word")->first)) ? 1 : 0);
    return 0;
}
и он бы вызвал по крайней мере на один вопрос меньше.
1
Эксперт JSЭксперт HTML/CSS
2151 / 1496 / 651
Регистрация: 16.04.2016
Сообщений: 3,696
09.05.2020, 08:50
Аххх-ха, запомним

Благодарю за урок Хорошего утра\дня\вечера\ночи
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
09.05.2020, 08:50
Помогаю со студенческими работами здесь

Первое слово, совпадающее со словом а, заменить на слово b
Очень нужна помощь в написании программы на TASM. Задан массив слов, заканчивающийся ‘*’. Даны два дополнительных слова а и b. Первое...

Как получить копию pair из map контейнера?
Всем привет. Имеется внутри класса контейнер map, у класса есть метод который возвращает при каждом вызове, следующий элемент контейнера...

Map : как по номеру элемента получить сам элемент контейнера?
Додумался только до такого: int n = 2; std::map&lt; String, String &gt; MASS; std::map&lt;String, String&gt;::iterator it = MASS.begin(); ...

Map структура с ключом
Здравствуйте есть такой вопрос я решил использовать map для работы под ключом Я у меня есть struct MemberHouse { int mX; ...

Использование контейнера map
Доброе утро) Никак не пойму как пользоваться контейнером map и зачем он, вообще, нужен?! Скажем есть у меня такая программа(или точнее...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере нетипового документа выдачи шин для спецтехники с табличной частью, разработанного в конфигурации КА2. Данные берутся из. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru