从数组更改为包含数组的结构

时间:2012-04-03 19:41:14

标签: c++ arrays deque

我正在更改我的代码,以便它更适合我。

我有:

deque<array<array<int,4>,4>> visited;

现在我有:

deque<New_Array> visited;

New_Array是:

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

我的数组是这样的:

array<array<int,4>,4> myarray;

问题是我有一个像这样的else-if函数:

else if (find(visited.begin(), visited.end(), myarray)==visited.end())

此函数检查数组是否在访问的stack-deque中。如果不是那么else-function有效。但是现在,访问过的deque必须包含结构,而不是数组。 如何转换此功能以使用双端队列的新容器?

我进行了此更改,因此每个阵列都可以用数字(h)连接。 我需要检查数组,我不关心数字。

修改

错误C2678:二进制'==':找不到哪个运算符带有'New_Array'类型的左手操作数(或者没有可接受的转换)

2 个答案:

答案 0 :(得分:2)

也许您可以使用std::find_if

else if (find_if(visited.begin(), visited.end(), 
         [&myarray](const NewArray& newArray) {
           return myarray == newArray.pinak;
         }) == visited.end())

std::find_if(Iterator first, Iterator last, Predicate pred)将一个迭代器返回到[first,last]范围内的第一个元素,对其应用pred,它是真的。

第一个和第二个参数visited.begin()visited.end()指明我们应该检查名为std::deque<NewArray>的{​​{1}}。

因此,我们遍历名为visited的{​​{1}},依次测试每个元素。

对于双端队列的每个元素,我们应用此谓词:

std::deque

此语法是lambda表达式。它创建了一个对象,随后可以由visited运算符调用(事实上,[&myarray](consts NewArray& newArray) { return myarray == newArray.pinak } 确实如此)。

lambda的第一部分列出了变量,该变量将可用于表达式的主体。在这种情况下,()通过const引用使该变量在正文中可用。

下一部分是find_if[&myarray]的参数列表。它与任何其他函数具有相同的含义。

最后,表达式的主体将operator()的传入元素与变量(const NewArray& newArray)进行比较。为了确定相等性,我们将数组与传入结构的visited成员进行比较。

简而言之,myarray功能:

  • 浏览pinak的每个元素。对于每个元素,它:
  • 调用列出的函数,
  • 将元素的find_if成员与visited
  • 进行比较

pinak然后返回一个指向所选元素的迭代器,如果没有,则返回myarray

答案 1 :(得分:0)

如果我正确地阅读了您的问题,您需要做的是为您的结构定义一个等于运算符。然后,Find可以在搜索中使用该运算符。