0

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

我有:

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())

此函数检查数组是否在访问的堆栈双端队列中。如果不是,则 else 函数起作用。但是现在,访问的双端队列必须包含结构,而不是数组。 如何转换此函数以使用双端队列的新容器?

我做了这个改变,所以每个数组都可以用一个数字(h)连接。我需要检查数组,我不在乎数字。

编辑:

错误 C2678:二进制“==”:未找到采用“New_Array”类型的左操作数的运算符(或没有可接受的转换)

4

2 回答 2

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>命名的visited.

所以,我们遍历被std::deque调用visited的,依次测试每个元素。

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

[&myarray](consts NewArray& newArray) { return myarray == newArray.pinak }

此语法是 lambda 表达式。它创建了一个对象,该对象随后可以由()操作员调用(find_if事实上,确实如此)。

lambda 的第一部分列出了可用于表达式主体的变量。在这种情况下[&myarray],通过 const 引用使该变量在主体中可用。

下一部分是operator():的参数列表(const NewArray& newArray)。它与任何其他功能具有相同的含义。

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

简而言之,find_if功能:

  • 遍历每个元素visited。对于每个元素,它:
  • 调用列出的函数,该函数
  • 将元素的pinak成员与myarray

find_if然后返回一个指向所选元素的迭代器,或者.end()如果没有比较相等。

于 2012-04-03T19:53:11.843 回答
0

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

于 2012-04-03T19:45:54.780 回答