C++ 检查前 5 个或后 5 个元素是否等于某个值

2024-01-19

有没有一种简单的方法可以在没有 for 循环或大量 if 和 else 的情况下做到这一点。

那么例如..

for (i=0;i<arr.size;i++) 
    if (any of the values from i-5 to i+5, ignoring i = value) 
    {
        // Do stuff ...
    }

我需要设置一个从 -5 到 +5 的嵌套循环吗?或者我可以用std::any_of也许


不管描述看起来如何,复杂性是linear因为内部循环(如果有)迭代恒定次数(并且不依赖于数据的数量)。

由于您建议您的数据具有数组形式(连续且可随机索引),并且使用嵌套循环实际上是利用所有优化功能和处理器缓存的最简单、最直接的方法。由于数据的分布式特性,任何“动态排序”容器的性能仍然很差。

我很可能会这样做

for(size_t i=5; i<N-5-1; ++i)
{
    int good=0; //will count the successful comparisons
    for(size_t j=i-5; j<=i+5; ++j) 
    {
        if(i==j) continue; //skip the i on i case
        if(array[j]==value) ++good;
    }
    if(good==10) do_stuff(i);
}

内部循环完全在缓存数据上执行(并且不依赖于 N,因此不会增加复杂性)。如今,CPU 的工作速度可能比尝试以某种方式对类似集合的容器(具有非连续存储)中的数据进行排序更快。

尽管许多开始/结束方法都很优雅,但旧的 KISS 索引获胜。

您可以参数化array[j]==value谓词以及5(并且 10 == 2*5)没有任何成本(将内联模板函数),这使得它更加通用。

如果您不想分支内部循环,您甚至可以使用以下命令使其更快

for(size_t i=5; i<N-5-1; ++i)
{
    int good=0; //will count the successful comparisons
    for(size_t j=i-5; j<i; ++j) good+=(array[j]==value);
    for(size_t j=i+1; j<=i+5; ++j) good+=(array[j]==value);
    if(good==10) do_stuff(i);
}

其中 11 个元素循环分为两半(避免检查 j==i)并且增量good是按函数“计算”的,没有分支。这也将导致预测管道处理器的执行速度更快。


EDIT

看来我误解了只有一个相等的值就足够了(不是全部)。

如果是这种情况,您可以检查一下good!=0,但你甚至可以快捷方式:

for(size_t i=5; i<N-5-1; ++i)
{
    bool good=false; //will count the successful comparisons
    for(size_t j=i-5; j<i && !good; ++j) good|=(array[j]==value);
    for(size_t j=i+1; j<=i+5  && !good; ++j) good|=(array[j]==value);
    if(good) do_stuff(i);
}

一旦找到匹配,这将打破循环,但使循环不再不可展开。 去除&& !good不会切断循环,但可能会运行它们直到结束,这比检查是否切断要快。

如果你快捷地切断循环,你可以使用=代替|=,如果你不使用快捷方式,使用 bool 没有任何优势:|=从编译器的角度来看,比+=

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ 检查前 5 个或后 5 个元素是否等于某个值 的相关文章

  • 如何在 .NET Framework 2.0 中模拟“Func<(Of <(TResult>)>) 委托”?

    我尝试使用这个类代码项目文章 http www codeproject com KB threads AsyncVar aspx在 VB NET 和 NET Framework 2 0 中 除了这一行之外 所有内容似乎都可以编译Privat
  • 如何将非静态类成员“std::bind”绑定到 Win32 回调函数“WNDPROC”?

    我正在尝试将非静态类成员绑定到标准WNDPROC http msdn microsoft com en us library ms633573 aspx功能 我知道我可以通过将类成员设为静态来简单地做到这一点 但是 作为一名 C 11 ST
  • 在 DataView 的 RowFilter 中选择 DISTINCT

    我试图根据与另一个表的关系缩小 DataView 中的行范围 我使用的 RowFilter 如下 dv new DataView myDS myTable id IN SELECT DISTINCT parentID FROM myOthe
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 使用 LINQ2SQL 在 ASP.NET MVC 中的各种模型存储库之间共享数据上下文

    我的应用程序中有 2 个存储库 每个存储库都有自己的数据上下文对象 最终结果是我尝试将从一个存储库检索到的对象附加到从另一个存储库检索到的对象 这会导致异常 Use 构造函数注入将 DataContext 注入每个存储库 public cl
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 使用 Newtonsoft 和 C# 反序列化嵌套 JSON

    我正在尝试解析来自 Rest API 的 Json 响应 我可以获得很好的响应并创建了一些类模型 我正在使用 Newtonsoft 的 Json Net 我的响应中不断收到空值 并且不确定我的模型设置是否正确或缺少某些内容 例如 我想要获取
  • 为什么 Google 测试会出现段错误?

    我是 Google Test 的新手 正在尝试提供的示例 我的问题是 当我引入失败并设置GTEST BREAK ON FAILURE 1 或使用命令行选项 GTest 将出现段错误 我正在考虑这个例子 https code google c
  • 由 IHttpClientFactory 注入时模拟 HttpClient 处理程序

    我创建了一个自定义库 它会自动为依赖于特定服务的 Polly 策略设置HttpClient 这是使用以下方法完成的IServiceCollection扩展方法和类型化客户端方法 一个简化的例子 public static IHttpClie
  • 将 Word 文档另存为图像

    我正在使用下面的代码将 Word 文档转换为图像文件 但是图片显得太大 内容不适合 有没有办法渲染图片或将图片保存到合适的尺寸 private void btnConvert Click object sender EventArgs e
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • C#:帮助理解 UML 类图中的 <>

    我目前正在做一个项目 我们必须从 UML 图编写代码 我了解 UML 类图的剖析 但我无法理解什么 lt
  • C# HashSet 只读解决方法

    这是示例代码 static class Store private static List
  • 为什么 std::strstream 被弃用?

    我最近发现std strstream已被弃用 取而代之的是std stringstream 我已经有一段时间没有使用它了 但它做了我当时需要做的事情 所以很惊讶听到它的弃用 我的问题是为什么做出这个决定 有什么好处std stringstr
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • “接口”类似于 boost::bind 的语义

    我希望能够将 Java 的接口语义与 C 结合起来 起初 我用过boost signal为给定事件回调显式注册的成员函数 这非常有效 但后来我发现一些函数回调池是相关的 因此将它们抽象出来并立即注册所有实例的相关回调是有意义的 但我了解到的
  • 动态添加 ASP.Net 控件

    我有一个存储过程 它根据数据库中存储的记录数返回多行 现在我想有一种方法来创建 div 带有包含该行值的控件的标记 如果从数据库返回 10 行 则 10 div 必须创建标签 我有下面的代码来从数据库中获取结果 但我不知道如何从这里继续 S
  • 使用 C# 读取 Soap 消息

  • 按 Esc 按键关闭 Ajax Modal 弹出窗口

    我已经使用 Ajax 显示了一个面板弹出窗口 我要做的是当用户按 Esc 键时关闭该窗口 这可能吗 如果有人知道这一点或以前做过这一点 请帮助我 Thanks 通过以下链接 您可以通过按退出按钮轻松关闭窗口 http www codepro

随机推荐