在列表模板中搜索空白

时间:2018-08-30 09:55:55

标签: c++ templates linked-list doubly-linked-list

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

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 :(得分:1)

您的代码中有4个问题:

  1. f是一个迭代器。要访问该值以进行比较,您需要取消引用迭代器*f
  2. 您的列表中包含单个字符,因此您应该将其与空格字符' '进行比较,而不是与包含单个空格" "的字符串进行比较
  3. std::list::remove接受的值不是迭代器,您需要std::list::erase
  4. 在删除元素之后,您需要小心使用迭代器的方式,需要使用从擦除返回的迭代器

更正后的代码是:

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

答案 1 :(得分:0)

代码中的

f是一个迭代器,它指向列表L1中的元素。迭代器只是后面的一些奇特的指针,因此,如果要访问迭代器指向的元素,则可以使用DataModel d1(/* Parameter... */); ComputationModel c1(/* Parameter... */); DataModel d2(d1); // copy-construct instance, d1 passed as refence to the base class DataModel d3(c1); // same behavior

因此您的代码应为:     列表L1;

DataModel(const DataModel& other) = default;

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

还有一个注意事项,当您使用迭代器从L1中删除一个元素时,该迭代器会自动递增(指向下一个元素),并且它会再次通过for递增,因此您跳过了一个元素。 / p>