我想要删除双端队列的元素。当你有一个包含结构的双端队列并且你想要从后到前打印元素,但是你不想打印具有相同结构元素的元素时,你怎么做?
我有这样的结构:
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]);
}
}
}
}
答案 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()));
这将只移动所有元素而不复制它们。