在结构的Deque中打印第一个数组

时间:2012-06-18 12:52:54

标签: c++ arrays for-loop iterator deque

我有一个包含这种结构的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=0h=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应该是此时接近双端队列的那个。

4 个答案:

答案 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;
            }    
        }    
    }
}