Поиск пустых мест в списке шаблонов - PullRequest
0 голосов
/ 30 августа 2018

Я пытаюсь найти список (шаблон) и проверить, не содержит ли список пробелы. Если есть пробелы, я хочу удалить их из списка.

list <char> L1;

if (!L1.empty())
{

    for (auto f = L1.begin(); f != L1.end(); ++f)
    {
        if (f == " ")
            L1.remove(f);
    }
}

Ошибка: IntelliSense: нет operator "==" соответствует этим операндам Типы операндов: std::_List_iterator<std::_List_val<std::_List_simple_types<char>>> == const char

Как мне это реализовать?

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

В вашем коде 4 проблемы:

  1. f - итератор. Чтобы получить доступ к значению для сравнения, вам нужно разыменовать итератор *f.
  2. ваш список содержит одиночные символы, поэтому вы должны сравнивать его с пробелом ' ', а не со строкой, содержащей один пробел " "
  3. std::list::remove принимает значение не итератор, вам нужно std::list::erase
  4. после удаления элемента вы должны быть осторожны с тем, как вы используете свой итератор, вам нужно использовать итератор, возвращенный из erase

Исправленный код:

if (!L1.empty())
{
    for (auto f = L1.begin(); f != L1.end();)
    {
        if (*f == ' ')
        {
            f = L1.erase(f);
        }
        else
        {
            ++f;
        }
    }
}

Обратите внимание, что std::list имеет эту встроенную функцию, поэтому вы можете просто позвонить

L1.remove(' ');

P.S. не доверяйте ошибкам от intellisense, они лучше, чем раньше, но все же не на 100% надежны, всегда компилируйте свой код, чтобы получить истинное сообщение об ошибке.

0 голосов
/ 30 августа 2018

f в вашем коде - это итератор, который указывает на элемент в вашем списке L1. Итераторы - это лишь некоторые причудливые указатели, поэтому, если вы хотите получить доступ к элементу, на который указывает ваш итератор, вы можете просто использовать *f.

Таким образом, ваш код должен быть: список L1;

if (!L1.empty())
{

    for (auto f = L1.begin(); f != L1.end();)
    {
        if (*f == ' ')
            L1.remove(f);
        else
            ++f;
    }
}

EDIT: Также, как указывает @ paler123, вы должны изменить двойные кавычки на апострофы, поскольку кавычки используются для массива символов и апострофы для символов.

Еще одно замечание: когда вы удаляете элемент из L1 с помощью итератора, итератор автоматически увеличивается (указывая на следующий элемент), и он снова увеличивается на величину for, поэтому вы пропускаете один элемент.

...