我想知道是否可以在另一个数组{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) ^
答案 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::search
。 Test 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};
...