当前位置: 首页 > 知识库问答 >
问题:

在另一个数组中查找一个数组作为子字符串

凌翔宇
2023-03-14

我想知道是否可以将一个数组{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:error:“make_boyer_moore_searcher”不是“std”std::make_boyer_moore_searcher的成员(^bm.cpp:15:19:error:无法将“std::basic_ostream”lvalue绑定到“std::basic_ostream&”std::cout<<“在偏移量处找到的字符串”^,该字符串包含在从/usr/include/C++/4.8/iostream:39:0,从_traits=std::char_traits;_tp=std::array]'operator<<(basic_ostream<_chart,_traits>&__os,const_tp&__x)^bm.cpp:18:19:error:无法将'std::basic_ostream'lvalue绑定到'std::basic_ostream&&'std::cout<<“字符串”< &__os,const_tp&__x)^

共有2个答案

凤高翰
2023-03-14

删除make_boyer_moore_searcher,只使用std::search。测试它

#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";
}

编辑:

作为对注释的响应,还可以搜索一个2D数组。在std::search中,使用运算符==比较元素。因此在本例中,您可以通过将代码更改为:

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};
...

测试它

谭铭
2023-03-14

如果要使用make_boyer_moore_searcher,则应包括正确的头,如参考页面中所述:

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

在您的代码中,您还尝试使用运算符<<打印出intstd::array(您称之为string)。您可以重载它或改用循环:

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

通过您的数据,您应该获得:

The string 67 55 65  found at offset 2
 类似资料:
  • 问题内容: 给定一个字节数组,我如何在其中找到(较小)字节数组的位置? 使用,该文档看起来很有希望,但是如果我正确的话,那只会让我在要搜索的数组中找到一个单独的字节。 (我认为这并不重要,但以防万一:有时搜索字节数组将是常规的ASCII字符,有时是控制字符或扩展的ASCII字符。因此使用String操作并不总是合适的) 大数组可能在10到10000个字节之间,而小数组大约在10个字节。在某些情况下

  • 问题内容: 我有两个numpy数组A和B。A包含唯一值,而B是A的子数组。 例如: 问题答案: 您可以使用带有- 如果您关心维护订单,也可以使用- 对于一般情况,当&是未排序的数组时,您可以在中引入选项,就像这样- 为了解决一般情况,我还会添加我最喜欢的内容- 样品运行-

  • 问题内容: 最近有人要求我为一份工作编写3个测试程序。它们将仅使用核心Java API和我选择的任何测试框架来编写。应在适当的地方实施单元测试。 尽管我根本没有收到任何反馈,但我想他们不喜欢我的解决方案(否则我会收到他们的来信),所以我决定在这里展示我的程序,并询问这种实现是否可以认为是好的,并且,如果没有,那为什么呢? 为避免混淆,我现在只问第一个。 实现一个函数,以在另一个更大的数组中查找一个

  • 问题内容: 如何有效地检查整数数组中的所有元素是否是Java中另一个数组的所有元素的子集?例如,[33 11 23]是[11 23 33 42]的子集。提前致谢。 问题答案: 从超集数组中取出一个。检查子集中数组的每个元素是否包含在中。这是非常快速的操作。

  • 我需要使用用户在 Java 扫描程序中输入的内容的输入,然后确定该特定输入是否被接受为检查清单数组中是否有足够的输入的一部分。此外,int 清单数组的特定值必须与字符串项数组匹配。例如,对于商品“螺丝刀”,数量为 500。 这是一个用于家庭作业的程序,我被困在一个步骤中,我必须找出用户想要购买的商品数量。如果输入量大于int[]库存量,那么我必须让用户知道并退出程序。但是如果我有足够的库存,那么我

  • 我有一个整数数组x=[1,2,3,6,9],其他数组是y=[1,2,3]。我想检查y数组是否存在于x中,但我很困惑如何做到这一点。