在列表模板中搜索空格

问题描述 投票:-1回答:2

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

list <char> L1;

if (!L1.empty())
{

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

错误:智能感知:没有operator "=="匹配这些操作数操作数类型是:std::_List_iterator<std::_List_val<std::_List_simple_types<char>>> == const char

我该如何实现?

c++ templates linked-list doubly-linked-list
2个回答
1
投票

您的代码中有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(' ');

附:不相信来自intellisense的错误它们比以前更好但仍然不是100%可靠,总是编译你的代码以获得真正的错误信息。


0
投票

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

因此,您的代码应该是:list L1;

if (!L1.empty())
{

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

编辑:另外正如@ paler123所指出的,你应该将双引号更改为撇号,因为引号用于char数组和撇号用于字符。

还有一点需要注意,当你使用迭代器从L1中删除一个元素时,迭代器会自动递增(指向下一个元素)并且它会再次由for增加,所以你跳过了一个元素。

© www.soinside.com 2019 - 2024. All rights reserved.