将数组作为子字符串查找到另一个数组

时间:2016-04-18 11:28:58

标签: c++ arrays search

我想知道是否可以在另一个数组{67,55,65}中找到数组{23,45,67,55,65,66,76,78}。我不想找到数组的单个元素,但整个数组。我尝试了一些代码

#include <iostream>
#include <algorithm>
#include <array>

int main()
{
    std::array<int,8> in = {23,45,67,55,65,66,76,78};
    std::array<int,3> sstr = {67,55,65};
   auto it = std::search(in.begin(), in.end(),
                   std::make_boyer_moore_searcher(
                       sstr.begin(), sstr.end()));
    if(it != in.end())
        std::cout << "The string " << sstr << " found at offset "
                  << it - in.begin() << '\n';
    else
        std::cout << "The string " << sstr << " not found\n";
}

编辑:使用make_boyer_moore_searcher的原因是我的数组的大小,粗略计算,可能是大约1000万。我想要一种有效的搜索技术。

我不确定我的代码是否应该有效。我收到了很多错误

  

bm.cpp:12:20:错误:'make_boyer_moore_searcher'不是'std'的成员                       的std :: make_boyer_moore_searcher(                       ^   bm.cpp:15:19:错误:无法将'std :: basic_ostream'左值绑定到'std :: basic_ostream&amp;&amp;'            std :: cout&lt;&lt; “字符串”&lt;&lt;重新&lt;&lt; “发现偏移”                      ^   在/usr/include/c++/4.8/iostream:39:0中包含的文件中,                    来自bm.cpp:1:   /usr/include/c++/4.8/ostream:602:5:错误:初始化'std :: basic_ostream&lt; _CharT,_Traits&gt;&amp;的参数1 std :: operator&lt;&lt;(std :: basic_ostream&lt; _CharT,_Traits&gt;&amp;&amp;,const _Tp&amp;)[with _CharT = char; _Traits = std :: char_traits; _Tp = std :: array]'        运算符&lt;&lt;(basic_ostream&lt; _CharT,_Traits&gt;&amp;&amp; __os,const _Tp&amp; __x)        ^   bm.cpp:18:19:错误:无法将'std :: basic_ostream'左值绑定到'std :: basic_ostream&amp;&amp;'            std :: cout&lt;&lt; “字符串”&lt;&lt;重新&lt;&lt; “没找到\ n”;                      ^   在/usr/include/c++/4.8/iostream:39:0中包含的文件中,                    来自bm.cpp:1:   /usr/include/c++/4.8/ostream:602:5:错误:初始化'std :: basic_ostream&lt; _CharT,_Traits&gt;&amp;的参数1 std :: operator&lt;&lt;(std :: basic_ostream&lt; _CharT,_Traits&gt;&amp;&amp;,const _Tp&amp;)[with _CharT = char; _Traits = std :: char_traits; _Tp = std :: array]'        运算符&lt;&lt;(basic_ostream&lt; _CharT,_Traits&gt;&amp;&amp; __os,const _Tp&amp; __x)        ^

2 个答案:

答案 0 :(得分:4)

如果您想使用make_boyer_moore_searcher,则应该包含正确的标题,如reference page中所述:

#include <experimental/algorithm>
#include <experimental/functional>

然后,由于那些不属于std,你应该使用:

来调用它们
auto it =   std::experimental::search(in.begin(), in.end(),
                 std::experimental::make_boyer_moore_searcher(
                   sstr.begin(), sstr.end()));

在您的代码中,您也尝试使用operator<<打印std::array int(您称之为字符串)。您可以重载它或使用循环:

for ( int i : sstr ) {
     std::cout << i << ' ';
}

根据您的数据,您应该获得:

The string 67 55 65  found at offset 2

答案 1 :(得分:3)

删除make_boyer_moore_searcher并仅使用std::searchTest it

#include <iostream>
#include <algorithm>
#include <array>

int main()
{
    std::array<int,8> in = {23,45,67,55,65,66,76,78};
    std::array<int,3> sstr = {67,55,65};
   auto it = std::search(in.begin(), in.end(), sstr.begin(), sstr.end());
    if(it != in.end())
        std::cout << "The string found at offset "
                  << it - in.begin() << '\n';
    else
        std::cout << "The string not found\n";
}

修改

在回复评论时,也可以搜索二维数组。在std::search元素中使用operator==进行比较。因此,在这种情况下,您可以通过将代码更改为:

来使其工作
std::array<std::array<int, 3>, 4> in {{ {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }};
std::array<std::array<int,3>, 1> sstr = {10,11,12};
...

Test it