@vefa_young

Почему один и тот же код даёт разные результаты компиляции?

Решаю задачки на codewars, и первый раз столкнулся с такой проблемой: в MVS код компилируется верно, в отличие от того, что получается в онлайн-компиляторе на сайте (как и в других онлайн-компиляторах). в настройках проекта в MVS стоит C++ 17 (этот же стандарт используется на codewars).

По итогу работы функции is_merge в обоих случаях должен быть получен true. в MVS этот результат я и получаю, но на codewars возвращается false. подозреваю, что дело может быть в методе find, но я в кодинге новичок, поэтому хз.

Сам код:
#include <iostream>
#include <unordered_map>

bool is_merge(const std::string& s, const std::string& part1, const std::string& part2)
{
    if (s.size() < part1.size() + part2.size()) return false;

    std::string sCopy = s;
    std::unordered_multimap<int, char> part1map;
    std::unordered_multimap<int, char> part2map;
    int index = 0;
    int order = 0;

    for (auto& letter : part1)
    {
        part1map.emplace(index, letter);
        ++index;
    }

    index = 0;

    for (auto& letter : part2)
    {
        part2map.emplace(index, letter);
        ++index;
    }

    for (auto& elem : part1map)
    {
        if (sCopy.find(elem.second) != std::string::npos && elem.first >= order) 
        {
            sCopy.erase(sCopy.find(elem.second), 1);
            order = elem.first;
        }
    }

    order = 0;

    for (auto& elem : part2map)
    {
        if (sCopy.find(elem.second) != std::string::npos && elem.first >= order)
        {
            sCopy.erase(sCopy.find(elem.second), 1);
            order = elem.first;
        }
    }

    return sCopy.size() == 0 ? true : false;
}

int main()
{
   std::cout << is_merge("acab", "ab", "ac") << std::endl;
   std::cout << is_merge("codewars", "code", "wars") << std::endl;
}
  • Вопрос задан
  • 353 просмотра
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Что этот код должен, по вашему делать? Я отлично вижу, как он может в этих случаях вернуть false. Если ваш цикл в вашем UNORDERED мапе сначала возьмет самый последний символ сторки part1, то он присвоит переменной order максимально возможное значение и больше ни одино условие в цикле не выполнется - ни один символ больше не удалится.

Разница в поведении компиляторов обусловлена тем, что они по разному мешают этот самый НЕУПОРЯДОЧЕННЫЙ мап. Возможно, там разные хеш функции используются.

И, кстати, ваши multimap-ы тут вообще бесполезны. Во-первых, зачем вам MULTImap, ведь у вас все ключи - это индексы симовлов - уже разные. Во-вторых, зачем вам вообще map, если вы там по каждому индексу храние символ, что итак уже делает строка! У вас там part1map[i] == part1[i] всегда. Вместо цикла по мапу, можно пройтись циклом от 0 до длины строки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы