Как исправить сбой, возникающий при условном копировании - PullRequest
0 голосов
/ 10 июня 2019

Я пытаюсь сохранить только альфа-символы строки 's' в мою коллекцию символов, используя std :: copy_if, но выдает сбой во время оператора копирования.

std::string s{"Love"};
std::deque<char> dr;
std::deque<char>::reverse_iterator itr =std::copy_if(s.cbegin(),s.cend   (),dr.rbegin(),[](char c){return isalpha(c);});

program.exeперестал работать

1 Ответ

1 голос
/ 10 июня 2019

Вероятная проблема в том, что ваш deque недостаточно велик для размещения копируемых символов.std::copy_if не изменяет размер deque (как это может быть, поскольку у него есть только итератор для работы)?Обычный ответ - использовать специальный тип итератора, называемый std::front_insert_iterator, который будет вызывать push_front для увеличения deque при копировании элементов.Вы можете создать std::front_insert_iterator с помощью функции std::front_inserter.Подобно этому

auto itr = 
    std::copy_if(s.cbegin(), s.cend(),
        std::front_inserter(dr), 
        [](char c){return isalpha(c);});

PS, также существуют соответствующие std::back_insert_iterator и функция std::back_inserter, которые используются чаще.Но std::front_inserter подходит для вашего случая, поскольку кажется, что вы хотите изменить последовательность символов, когда вставляете их в deque.

...