C ++ Copy_if с использованием лямбды - PullRequest
0 голосов
/ 02 мая 2018

У меня есть массив string s, который я хочу скопировать в vector из string s , только если конкретная длина string равна равна до известной стоимости.

function(int len){
string lines[8]{
"a string",
"another string",
"and another"
etc..
}
vector<string> v (8);

std::copy_if(lines->begin(), lines->end(), std::back_inserter(v), 
    [len](std::string i) { return len == i.length(); });

Я получаю следующие ошибки:

ошибка C2664: 'bool Сетка оператор :: SearchGrid :::: () (std :: string) const ': невозможно преобразовать аргумент 1 из' char 'в 'Станд :: строка'

ошибка C2679: бинарный '=': не найден оператор, который занимает правую руку операнд типа 'char' (или нет приемлемого преобразования)

оба они происходят в algorithm header, поэтому я не уверен, где я иду не так. Новое в этих новых лямбда-выражениях.

1 Ответ

0 голосов
/ 02 мая 2018

lines->begin() и lines->end() ведут себя не так, как вы ожидали. lines затухает до string*, затем lines->begin() вернет итератор 1-го std::string массива lines, а разыменование на итераторе получит char.

Вместо этого можно использовать std::begin и std::end.

std::copy_if(std::begin(lines), std::end(lines), std::back_inserter(v), 
    [len](std::string i) { return len == i.length(); });

Кстати: vector<string> v (8); инициализирует v с 8 элементами (пусто std::string с); потому что вы используете back_inserter позже, я думаю, достаточно просто vector<string> v;. В противном случае вы получите 8+ элементов в v, наконец.

Другие проблемы: Объявление типа возвращаемого значения функции кажется потерянным; Тип лямбда-параметра может быть изменен на const std::string&.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...