Как заставить функцию std ::fill работать с std::map?

#c #c 17

#c #c 17

Вопрос:

Я хочу использовать std::fill функцию из библиотеки алгоритмов для заполнения ‘-‘ во второй части пары. Возможно ли это достичь?

 #include <algorithm>
#include <map>
int main()
{
    std::map<int, unsigned char> board(10);

    // What I want the std::fill to do the equivalent of  
    for (autoamp; cell : board) {
        cell.second = '-';
    }

    // What I've tried:
    std::fill(board.begin(), board.end(), [amp;](auto amp;pair){pair.second = '-';});
}
 

Ответ №1:

fill присваивается каждому элементу диапазона, для которого он вызывается, в то время как вы хотите присвоить значения этим элементам (пары ключ-значение). Начиная с C 20, вы можете использовать адаптер ranges::views::values диапазона:

 std::ranges::fill(std::ranges::views::values(board), '-');
 

Если вы не можете использовать C 20, ваш код будет работать, изменившись fill на for_each :

 std::for_each(board.begin(), board.end(), [amp;](auto amp;pair){pair.second = '-';});
 

Комментарии:

1. Большое спасибо за ваш ответ! Нужно ли добавлять какие-либо включения?

2. std::for_each <algorithm> включен, который вы уже включаете. Доступны возможности диапазонов <ranges> , если они доступны.

3. Я попытался поместить Visual Studio 2019 в последнюю версию C , я не думаю, что он ее еще поддерживает, но std::for_each великолепен! Большое спасибо!