擦除Deque容器的元素

时间:2012-06-17 11:23:18

标签: c++ deque

我想要删除双端队列的元素。当你有一个包含结构的双端队列并且你想要从后到前打印元素,但是你不想打印具有相同结构元素的元素时,你怎么做?

我有这样的结构:

struct New_Array {                    
    array<array<int,4>,4> mytable;       
    int h;
};

deque填充了前一过程中的元素。 您想要打印双端队列中的所有元素,但您打印的每个表格都必须具有唯一的“h”。只有您找到的具有特定“h”的第一个表必须打印,不应打印具有相同“h”的其他表。我认为这也可以用“查找”功能来补充。

我们将从双端队列的后面开始找到的“h”的值将为0,并且它将朝着双端队列的前方增加其值。

我试过这个:

void Find_Solution_Path(deque<New_Array> Mydeque)
{
    while(Mydeque.size()>0)
    {
        New_Array y=Mydeque.back();
        PrintBoard(y);         //this is a function that prints the 4x4 array.
        Mydeque.pop_back();
        for(unsigned int i=0; i<Mydeque.size(); i++)
        {
            New_Array xxx=Mydeque[i];
            if(xxx.h==y.h)
            {
                Mydeque.erase(Mydeque[i]);
            }
        }
    }
}

3 个答案:

答案 0 :(得分:2)

我不会使用deque而是一套。如果你绝对需要deque,那就创建一个集合。定义&lt;具有适当标准的运算符&lt;反映出独特性。将每个打印元素插入到集合中。在打印之前,检查元素是否已存在于集合中(查找)。

HTH,马丁

答案 1 :(得分:1)

一种方法是使用std::unique_copy

#include <iostream>
#include <algorithm>
#include <iterator>
#include <deque>

struct New_Array {
    array<array<int,4>,4> mytable;
    int h;
    // unique_copy needs this:
    bool operator==(const New_Array& other) { return h == other.h; }
};

ostream& operator<<(ostream& out, const New_Array& v)
{
    return out << v.h;
}

int main()
{
    std::deque<New_Array> q;
    New_Array temp;

    // {1, 1, 2, 2, 3, 3}
    temp.h = 1;
    q.push_back(temp);
    q.push_back(temp);
    temp.h = 2;
    q.push_back(temp);
    q.push_back(temp);
    temp.h = 3;
    q.push_back(temp);
    q.push_back(temp);

    unique_copy(q.begin(), q.end(), ostream_iterator<New_Array>(cout, "\n"));
}

范围需要排序才能使unique_copy正常工作。在上述情况下不需要排序,因为我们按顺序插入元素。

答案 2 :(得分:0)

我相信@Martin的回答可能是最好的解决方案。如果您无法更改返回deque的函数的签名,则可以从中构造set,所有重复项将自动消失:

// First you need to declare a compare function for NewArray objects
struct NewArrayComp {
    bool operator()(const NewArray& a1, const NewArray& a2) const {
        return a1.h < a2.h;
    }
};

// Then you can construct a set from the deque
deque<NewArray> dq;
// ...
std::set<NewArray, NewArrayComp> s(dq.begin(), dq.end());

// Finally you can just print the arrays (without duplicates)
for (const auto& a : s)
    PrintBoard(a);

此解决方案的复杂度为O(n log n),而您的代码为O(n ^ 2)。

此外,如果您不想支付将deque中的元素复制到set中的成本,您可以在C ++ 11中使用移动语义:

std::set<NewArray, NewArrayComp> s;
std::move(dq.begin(), dq.end(), std::inserter(s, s.begin()));

这将只移动所有元素而不复制它们。