我有一个包含这种结构的Deque。
struct New_Array {
array<array<int,4>,4> mytable;
int h;
};
在这个结构中,2个不同的数组可能具有相同的h值。
deque<New_Array> Mydeque;
我也知道deque中有多少不同的h(steps
的值)。 deque中有多少个人(Mydeque.size()
)。
我需要为每个h打印一个数组。从h=0
到h=steps
开始(步骤是已知的int
值)。 要打印的每个数组必须更接近双端队列的末尾。
我试过这样的事情:
void foo(deque<New_Array> Mydeque, int steps)
for(int i=0; i<steps; i++)
{
deque<New_Array>::iterator it;
it = find(Mydeque.begin(),Mydeque.end(),i);
PrintBoard(*it); // This if a function where you enter the New_Array struct
// and it prints the array
}
}
上面给了我:error C2679: binary '==' : no operator found which takes a right-hand operand of type 'const bool' (or there is no acceptable conversion)
或类似的东西:
void foo(deque<New_Array> Mydeque, int steps)
for(int i=0; i<steps; i++)
{
deque<New_Array>::iterator it;
for(unsigned int j=0;j<Mydeque.size();j++)
{
it = find_if(Mydeque.begin(),Mydeque.end(),Mydeque[j].h==i);
PrintBoard(*it);
break;
}
}
上面给了我:error C2064: term does not evaluate to a function taking 1 arguments
编辑:deque
未排序。对于每个h
,应打印array
。此array
应该是此时接近双端队列的那个。
答案 0 :(得分:1)
记住最后一个值并跳过:
assert(!Mydeque.empty());
int old_h = Mydeque[0].h + 1; // make sure it's different!
for (std::size_t i = 0, end != Mydeque.size(); i != end; ++i)
{
if (Mydeque[i].h == old_h) continue;
print(Mydeque[i]);
old_h = Mydeque[i].h;
}
答案 1 :(得分:1)
首先,请注意您在堆栈上声明std::array
,因此存储也将在堆栈中。这意味着迭代结构涉及为每次比较加载(4 * 4 + 1)* int。如果这是性能敏感的,我建议使用std::vector
,因为加载仅仅是外部向量指针,而h
只比较h
。
struct New_Array {
vector<vector<int,4>,4> mytable;
int h;
};
其次,如果您需要通过h
值访问这些表,或者一次访问具有给定h
的所有表,请让每个人都更轻松,并将它们作为向量存储在地图中,或矢量的排序矢量:
std::map<int,std::vector<New_Array> > rolodex;
rolodex[someNewArray.h].push_back(someNewArray);
如果按顺序构造,那么每个矢量中的第一个项目将是要打印的项目:
for(auto it : rolodex) {
vector<New_Array> tablesForThisH = it->second;
if(tablesForThisH.begin() != tablesForThisH.end())
PrintBoard(it->second[0]);
}
由于std:map
按升序(我认为)顺序存储(并迭代)其键,因此将按升序运行不同的h
值。同样,它只需要加载堆栈存储的struct,它只是h
int和向量头(可能是12个字节,如this question中所述)。
请原谅我,如果代码错了,我的stl有点生锈。
答案 2 :(得分:0)
循环浏览deque
,并使用map
作为关键字将所有元素插入h
。由于您的h
值集似乎是连续的,因此您可以使用vector
,但测试是否已找到元素会更加困难。
答案 3 :(得分:0)
解决方案是:
void Find_Solution_Path(deque<New_Array> Mydeque, int steps)
{
for(int i=0; i<steps+1; i++)
{
for(int j=Mydeque.size()-1;j>-1;j--)
{
if (Mydeque[j].h==i)
{
PrintBoard(Mydeque[j]);
cout<<endl;
break;
}
}
}
}