在列表模板中搜索空白

Search for empty spaces in list template

我正在尝试搜索列表(模板)并检查列表是否包含空格。如果有空格,那么我想将它们从列表中删除。

list <char> L1;

if (!L1.empty())
{

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

Error: IntelliSense: no operator "==" matches these operands operand types are: std::_List_iterator<std::_List_val<std::_List_simple_types<char>>> == const char

我该如何实施?

f 在你的代码中是一个迭代器,它指向你的列表 L1 中的一个元素。迭代器只是一些奇特的指针,所以如果你想访问你的迭代器指向的元素,你可以使用 *f.

因此您的代码应该是: 列出 L1;

if (!L1.empty())
{

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

编辑: 同样正如@paler123 所指出的,您应该将双引号更改为撇号,因为引号用于字符数组,撇号用于字符。

另外请注意,当您使用迭代器从 L1 中删除一个元素时,迭代器会自动递增(指向下一个元素)并且它会通过 for 再次递增,因此您将跳过一个元素.

您的代码中有 4 个问题:

  1. f 是一个迭代器。要访问该值以进行比较,您需要取消引用迭代器 *f.
  2. 您的列表包含单个字符,因此您应该与 space 字符 ' ' 进行比较,而不是包含单个 space " "
  3. 的字符串
  4. std::list::remove takes a value not an iterator, you need std::list::erase
  5. 删除元素后,您需要注意如何使用迭代器,您需要使用从擦除返回的迭代器

更正后的代码是:

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% 可靠,请始终编译您的代码以获得真正的错误消息。