从std :: list中删除std :: tuple

时间:2019-03-31 05:02:52

标签: c++ list tuples

我有一个元组列表,需要从列表中删除元素,像这样:

enum class test
{
    mem1,
    mem2,
    mem3,
    mem4
};

struct A
{

};

int main()
{
    std::list<std::tuple<int, test, A>> tuple_list;

    // fill list with random objects
    for (int i = 0; i < 4; i++)
    {
        tuple_list.push_back(
               std::forward_as_tuple(i, static_cast<test>(i), A()));
    }

    // now remove it
    for (auto& ref : tuple_list)
    {
        tuple_list.remove(ref); // error C2678
    }
    return 0;
}
  

错误C2678:二进制'==':未找到需要左手操作的运算符   'const _Ty'类型的操作数(或没有可接受的转换)

如何在上述示例中从列表中删除元组元素?

编辑:

我尝试了以下方法,与前面的示例不同,它可以很好地编译,但是有运行时断言:

int main()
{
    list<tuple<int, test, A>> tuple_list;

    for (int i = 0; i < 4; i++)
    {
        tuple_list.push_back(
                std::forward_as_tuple(i, static_cast<test>(i), A()));
    }

    for (auto iter = tuple_list.begin(); iter != tuple_list.end(); iter++)
    {
        tuple_list.erase(iter);
    }
}
  

表达式:无法增加值的初始化列表迭代器

1 个答案:

答案 0 :(得分:1)

首先,您不想这样做。在基于范围的list的中间从for(或任何容器)中删除项目是造成灾难的原因,因为hidden behind the for loop are iterators一旦删除该项目就会失效。

这是与

的第二个实验相同的问题
for (auto iter = tuple_list.begin(); iter != tuple_list.end(); iter++)
{
    tuple_list.erase(iter); // iter rendered invalid. 
                            // That makes iter++ and iter != tuple_list.end()
                            // totally bogus.
}

此版本可以用

修复
for (auto iter = tuple_list.begin(); iter != tuple_list.end(); /* nothing here */)
{
    iter = tuple_list.erase(iter); // iter updated here
}

while (! tuple_list.empty()) 
{
     tuple_list.pop_front();
}

tuple_list.clear();

好。出了什么问题:

  

错误C2678:二进制'==':未找到采用'const _Ty'类型的左操作数的运算符(或没有可接受的转换)

表示无法比较元组的一部分之一。

struct A
{

};

没有相等运算符。解决方法是添加一个。

struct A
{
}; 

bool operator==(const A& lhs, const A& rhs)
{ 
    Comparison logic goes here 
}    

有用的附加读物:

Erase-Remove idiom可用于解决类似的问题。