LINUX.ORG.RU

История изменений

Исправление rumgot, (текущая версия) :

Вот это потому, что как в анекдоте:

«Я же говорил, что врач должен быть внимательным: я ведь засовывал палец один, а облизывал другой…»

Нужно так:

    std::map<std::string, int> counters = { {"hello", 5}, {"world", 5} };
    std::vector<std::string_view> keys;
    keys.reserve(counters.size());
    std::transform(std::begin(counters),
                   std::end(counters),
                   std::back_inserter(keys),
                   [](const std::pair<const std::string, int>& item) -> std::string_view {
                       return item.first;
                   });

    for (std::string_view k : keys) {
        std::cout << k << "\n";
    }

Потому что из описания std::map:

value_type std::pair<const Key, T>

Т.е. в твоем случае ты копируешь пару внутри лямбды и возвращаешь string_view, который указывает на скопированную временную переменную.

Исправление rumgot, :

Вот это потому, что как в анекдоте:

«Я же говорил, что врач должен быть внимательным: я ведь засовывал палец один, а облизывал другой…»

Нужно так:

    std::map<std::string, int> counters = { {"hello", 5}, {"world", 5} };
    std::vector<std::string_view> keys;
    keys.reserve(counters.size());
    std::transform(std::begin(counters),
                   std::end(counters),
                   std::back_inserter(keys),
                   [](const std::pair<const std::string, int>& item) -> std::string_view {
                       return item.first;
                   });

    for (std::string_view k : keys) {
        std::cout << k << "\n";
    }

Потому что из описания std::map:

value_type std::pair<const Key, T>

Т.е. в твоем случае ты копируешь пару внутри лямбды и возвращаешь string_view, который указывает на скопированную временную переменную.

Исходная версия rumgot, :

Вот это потому, что как в анекдоте:

«Я же говорил, что врач должен быть внимательным: я ведь засовывал палец один, а облизывал другой…»

Нужно так:

    std::map<std::string, int> counters = { {"hello", 5}, {"world", 5} };
    std::vector<std::string_view> keys;
    keys.reserve(counters.size());
    std::transform(std::begin(counters),
                   std::end(counters),
                   std::back_inserter(keys),
                   [](const std::pair<const std::string, int>& item) -> std::string_view {
                       return item.first;
                   });

    for (std::string_view k : keys) {
        std::cout << k << "\n";
    }

Потому что из описания std::map:

value_type std::pair<const Key, T>

Т.е. в твоем случае ты копируешь пару внутри лямбды и возвращаешь string_view, который указывает на скопированную временную переменную.