不能将find()与二维数组

时间:2017-01-07 20:51:53

标签: c++ arrays multidimensional-array find

我在二维数组上使用find时遇到了问题。每当我尝试执行这样的查找时,我都会得到一个不可理解的错误

我的代码:

#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

int st[200*1000][2];
int si[200*1000][2];

int main() {
    if (find(si, si+200000, true) == si+200000){
        //do something
    }
    for (int j = 0; j < ileSt; j++){
        for (int k = 0; k < 2; k++){
            if (find(st[j], st[j]+2, si[znakSi][k]) != st[j]+2){
                //do another thing
            }
        }
    }
    return 0;
}

错误:

In file included from /usr/include/c++/5/bits/stl_algobase.h:71:0,
                 from /usr/include/c++/5/bits/char_traits.h:39,
                 from /usr/include/c++/5/ios:40,
                 from /usr/include/c++/5/ostream:38,
                 from /usr/include/c++/5/iostream:39,
                 from prog.cpp:1:
/usr/include/c++/5/bits/predefined_ops.h: In instantiation of 'bool __gnu_cxx::__ops::_Iter_equals_val<_Value>::operator()(_Iterator) [with _Iterator = int (*)[2]; _Value = const bool]':
/usr/include/c++/5/bits/stl_algo.h:120:14:   required from '_RandomAccessIterator std::__find_if(_RandomAccessIterator, _RandomAccessIterator, _Predicate, std::random_access_iterator_tag) [with _RandomAccessIterator = int (*)[2]; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const bool>]'
/usr/include/c++/5/bits/stl_algo.h:161:23:   required from '_Iterator std::__find_if(_Iterator, _Iterator, _Predicate) [with _Iterator = int (*)[2]; _Predicate = __gnu_cxx::__ops::_Iter_equals_val<const bool>]'
/usr/include/c++/5/bits/stl_algo.h:3790:28:   required from '_IIter std::find(_IIter, _IIter, const _Tp&) [with _IIter = int (*)[2]; _Tp = bool]'
prog.cpp:19:31:   required from here
/usr/include/c++/5/bits/predefined_ops.h:194:17: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  { return *__it == _M_value; }
                 ^

另外,这是我的第一个问题,所以如果您认为它可以写得更好,请随时编辑它!

3 个答案:

答案 0 :(得分:1)

您可以使用直接寻址到2d数组元素来重写它。 例如:

    for (int j = 0; j < ileSt; j++)
{
    for (int k = 0; k < 2; k++)
    {
        if (find(&st[j][0], &st[j][0] + 2, si[znakSi][k]) != &st[j][0] + 2 )
        {
            //do another thing
        }
    }
}

或使用std :: begin获取数组的行地址

find(std::begin(st[j]), std::begin(st[j]) + 2, si[znakSi][k]) != std::begin(st[j]) + 2

答案 1 :(得分:0)

您正在尝试寻址数组外部的内存,并且必须使用指向数组的单个元素的指针来将多维数组作为单维数组来处理。

指针stint*[2]的类型int*不是(si+1),因此int*[2]指向第3个int({{1}的第二个子数组}} type,(si+200000)指向该数组中的第400001个int。编译器尝试专门化find()模板,假设你给它正确的迭代器,遵循该语义并以错误的方式工作...指向一个普通类型的指针可能是一个迭代器,指向数组的指针显然失败。您应该使用指向int*char*的指针(仅来自C ++ 11标准的定义char*得到定义的结果,但所有现有编译器都遵循C99行为),例如演员:

int *pSi = (int*)si;

其次,您尝试将布尔(true)常量与整数进行比较。模板要求第3个参数与迭代器的目标具有相同的类型。如果你使用int *那么它是int。无论是明确表达还是重新考虑,如果那是你真正想做的事情。

答案 2 :(得分:0)

si[n]中的每一个都是int[2],而不是intbool。因此,您无法对find si执行int[2] true数组boolint(或/usr/include/c++/5/bits/predefined_ops.h:194:17: error: ISO C++ forbids comparison between pointer and integer [-fpermissive] 用隐式转换)。错误消息告诉您基本相同的事情:

true

相反,以下代码应该允许您在二维数组中找到任何 int* const si_begin = &si[0][0]; int* const si_end = &si[200*1000][0]; if (find(si_begin, si_end, true) == si_end){ //do something } (即1):

true

如果您的目的是仅在内部数组的第一个元素中找到std::find(),那么就像评论中提到的Swift一样,最好使用自定义循环进行查找。 {{1}}仅用于在1-D数组中查找匹配元素。