std::find() 在 C 风格数组上向后?

2023-12-20

说我需要使用s:

typedef struct tagSOMESTRUCT   // Defined by someone else; C-compatible
{
    int count;
    int elements[256];
} SOMESTRUCT;

SOMESTRUCT s;

并说我有一个类似的功能:

template<typename RevFwdIt>
std::pair<RevFwdIt, RevFwdIt> some_slice_rev(RevFwdIt rbegin, RevFwdIt rend)
{
    RevFwdIt it = basename_rev(rbegin, rend);
    RevFwdIt e = std::find(rbegin, it, 5);
    return std::make_pair(e == it ? rbegin : e, it);
}

为了使用这个功能,我需要说

some_slice_rev(&s.elements[s.count - 1], &s.elements[-1]);

由于差一错误,(恕我直言)它很丑陋并且容易出错。

一方面,我不能简单地改变some_slice_rev to some_slice使用(更好)

some_slice(&s.elements[0], &s.elements[s.count]);

因为那时std::find将从头开始而不是从尾部搜索。

另一方面,代码本身对我来说已经被破坏了,因为我不明白如何std::find将处理作为原始指针的“反向迭代器”。

在这种情况下修复代码的最佳方法是什么?有什么方法可以使用作为原始指针的反向迭代器吗?或者是否有一个标准的重构机制来解决这个问题,other比改变SOMESTRUCT?


我不太确定我理解这个问题(这可能是由于您似乎试图避免的迭代器方向的尴尬混合),但我只是将您的注意力引向std::reverse_iterator:

#include <iostream>
#include <iterator>

// for example
template <typename Iter>
void print_it(Iter first, Iter last)
{
    std::cout << '|';

    for (; first != last; ++first)
        std::cout << ' ' << *first << " |";

    std::cout << std::endl;
}

int main()
{
    int arr[10] = {1, 2, 3, 4};

    int *begin = arr, *end = arr + 4;

    print_it(begin, end);
    print_it(std::reverse_iterator<int*>(end),
                std::reverse_iterator<int*>(begin));
}

它们的工作方式类似于双向迭代器,除了++是内部的--,反之亦然。

请注意,它有点难看。您可能需要一些实用函数:

#include <iostream>
#include <iterator>

// for example
template <typename Iter>
void print_it(Iter first, Iter last)
{
    std::cout << '|';

    for (; first != last; ++first)
        std::cout << ' ' << *first << " |";

    std::cout << std::endl;
}

template <typename Iter>
std::reverse_iterator<Iter> make_reverse_iterator(Iter iter)
{
    return std::reverse_iterator<Iter>(iter);
}

int main()
{
    int arr[10] = {1, 2, 3, 4};

    int *begin = arr, *end = arr + 4;

    print_it(begin, end);
    print_it(make_reverse_iterator(end),
                make_reverse_iterator(begin));
}

所以我想你想要这个:

template<typename ForwardIterator >
std::pair<ForwardIterator, ForwardIterator>
    some_slice(ForwardIterator begin, ForwardIterator end)
{
    typedef std::reverse_iterator<ForwardIterator> rev_iter;

    rev_iter it = basename(rev_iter(end), rev_iter(begin));
    rev_iter e = std::find(rev_iter(end), it, 5);

    return std::make_pair(it.base(), e.base());
}

现在相对偏离主题,但请注意s.elements[s.count]是未定义的行为,如果s.count is 256, 因为s.elements[s.count] is *(s.elements + s.count),这不是要取消引用的有效数组元素。

在实践中,完整的表达式就可以了,因为&*x取消到x,但你可能仍然想避免它:

some_slice(s.elements, s.elements + s.count);

s.elements[-1]也可能是未定义的行为,尽管我认为严格来说这可能是合法的,因为你有一个int数组之前的成员。

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

std::find() 在 C 风格数组上向后? 的相关文章

  • 用 C 语言制作查找表的最佳方法是什么?

    我正在开发一个嵌入式 C 项目 我有一个 LCD 显示屏 每个字符都有一个 5x7 点阵 要显示特定字符 您必须移动与要打开的点相关的 5 个字节 所以我需要制作某种带有键的查找表 我可以在其中传递 ASCII 字符 并返回一个 5 字节的
  • 使 minGW 控制台程序在没有控制台的情况下运行

    我在 MinGW 中制作了一个控制台程序 它执行网络和文件操作 然而 它是一个控制台程序 如何让它安静地运行 没有控制台 没有窗口 尝试这个 ShowWindow GetConsoleWindowHandle SW HIDE GetCons
  • Xamarin 中的 Task.ConfigureAwait(false) - 安全使用/建议使用?

    经验法则是 如果它不是与 UI 相关的方法 请使用Task ConfigureAwait false 如果我有一个接受接口的 PCL 核心库怎么办IUIAccess 核心库中的视图模型有一个方法 public Task ViewModelL
  • 提升解析器中的 Spirit 段错误

    我一直在尝试将我在本科编译器中编写的一些 lex 和 yacc 代码转换为精神代码以学习精神 我发现了一个我似乎无法弄清楚的段错误 我这样写了词法分析器 namespace lex boost spirit lex enum Tokens
  • 如何在 javascript 中使用 .net 资源文件

    无论如何 我可以在 javascript 中访问我的资源文件 resx 吗 如果没有 那么是否有任何解决方法可以用不同语言的 javascript 显示消息 如果您的 javascript 在页面中 您可以使用 var globalReso
  • lua_resume 的 from 参数的含义

    From Lua 5 2 参考手册 http www lua org manual 5 2 manual html lua resume int lua resume lua State L lua State from int nargs
  • 如何修改道路网络的 L 系统?

    向大家问好 我目前正在研究道路网络的程序生成 并偶然发现了 L 系统算法 根据我从有关该主题的各种科学论文以及有关该主题的论文的进一步论文中了解到 算法更改为使用 全局目标和局部约束 其中修改所采取的路径以适应地形等输入值和人口密度 现在我
  • 接收UDP数据包

    假设我的程序通过网络 UDP 发送 1000 字节 它是否保证接收方将 一批 接收 1000 个字节 或者他可能需要执行多次 读取 直到收到完整的消息 如果后者为真 我如何确保同一消息的数据包顺序不会 混淆 按顺序 或者协议可能保证这一点
  • C++ 中“return *this”是什么意思?

    我正在将 C 程序转换为 C 但这部分让我感到困惑 return this 是什么意思 template lt EDemoCommands msgType typename PB OBJECT TYPE gt class CDemoMess
  • 可变长度数组性能影响 (C/C++)

    我正在编写一个相当简单的函数 它将数组发送到文件描述符 但是 为了发送数据 我需要附加一个一字节标头 这是我正在做的事情的简化版本 它似乎有效 void SendData uint8 t buffer size t length uint8
  • 移动数组中的元素

    我需要一点帮助 我想将数组中的元素向上移动一个元素 以便新位置 1 包含位置 1 中的旧值 new 2 包含 old 1 依此类推 旧的最后一个值被丢弃 第一个位置的新值是我每秒给出的新值 我使用大小为 10 的数组 uint32 t TE
  • File.Delete 进程无法访问该文件,因为该文件正在被另一个进程使用

    public bool DownloadMp3File DownloadedMp3 mp3 WebClient client new WebClient string filePath bool wasDownload false try
  • C 错误:格式“%s”需要“char *”类型的参数,但参数 2 的类型为“char (*)[100]”

    过去几天我正在用 c 进行练习 并且收到此警告 如标题所示 我已经尝试了很多东西 但我真的不知道如何准确地解决这个问题 我不擅长编程 所以会有错误 以下是我正在使用的结构 无法更改 因为它们就是这样给出的 typedef struct bo
  • IBM Rhapsody 中状态图终止连接器的理解

    在IBM Rhapsody中 如果我使用new创建了一个类的实例 那么我们是否必须通过调用delete来处理内存的释放 或者Termination Connector将在其状态图中通过内存释放来处理其销毁 如果您使用 C 和 OXF 对象执
  • 将引用托管代码中分配的内存的指针传递给非托管代码

    我在 C 中分配了一个大的 char 缓冲区 并且希望将指向此数据的指针传递给 DLL 中的未管理的 c 函数 现在我认为要使其工作 必须修复字符缓冲区 以便 GC 在函数工作时无法移动它 如果是这样 我会声明缓冲区已固定并调用 UNSAF
  • 将对象转换为泛型类型

    我已经有一段时间没有睡觉了 所以这可能比我想象的要容易 我有一个通用类或多或少是这样的 public class Reference
  • 如何在网格视图中突出显示文本的结果? [复制]

    这个问题在这里已经有答案了 可能的重复 如何突出显示某个单词 https stackoverflow com questions 9546761 how can i highlight a word 我有一个网格视图和一个文本框 用于从列中
  • MDI 窗体中的子窗口对接

    我有一个 MDI 表单和其中的一些子表单 我将子窗体停靠到 MDI 窗口的不同区域 但是当任何子窗体失去焦点时 其他停靠的窗体将重新排列 由于混乱 我准备了一组图像来展示该行为 Image1 单击任何窗口之前 Image2 点击窗口2后 问
  • 将 tiff 像素长宽比更改为正方形

    我正在尝试对多页 tiff 文件执行条形码识别 但是 tiff 文件是从传真服务器 我无法控制 发送给我的 该服务器以非方形像素长宽比保存 tiff 这导致图像由于纵横比而被严重挤压 我需要将 tiff 转换为方形像素长宽比 但不知道如何在
  • Phong 着色问题

    我正在根据以下内容编写着色器冯模型 http en wikipedia org wiki Phong reflection model 我正在尝试实现这个方程 其中 n 是法线 l 是光线方向 v 是相机方向 r 是光反射 维基百科文章中更

随机推荐

  • browserify external 与 except 之间有什么区别?

    我在用着browserify并试图让它跳过浪费时间包括或解析 jquery 和其他require less 文件我通过 CDN 加载 我应该使用bundle exclude jquery or bundle external jquery
  • Apple iOS 浏览器随机不会呈现动态加载的 HTML 对象

    我们遇到的问题仅在 iOS 浏览器 iOS 12 0 上明显 我们的 SPA 应用程序使用 HTML 对象标签通过 JavaScript 将小部件 HTML CSS JS 文件 加载到页面上 该问题是间歇性的 当页面加载时 某些小部件不会在
  • 在 AWS DynamoDB 上存储聊天日志?

    我正在考虑使用 AWS DynamoDB 构建一个聊天应用程序 该应用程序将支持一对一和群聊 我想为每个聊天创建一个表 其中每个发送的聊天文本行都有一条记录 DynamoDB 适合这种工作吗 我也在考虑合并两个表 但是 如果 假设 有 10
  • MongoDB 身份验证错误

    连接 Mongodb 时出现此错误 我不太确定这个错误是什么 使用 CompositeServerSelector Selectors ReadPreferenceServerSelector ReadPreference Mode Pri
  • 并排对齐 2 个 div

    我需要并排对齐 2 个 div 它们都位于没有设置高度的包装 div 内 我的问题是 当我分别使用 float left 和 float right 时 div 似乎不会 留在 包装器 div 内 我可以看出 因为包装器 div 与页面具有
  • 如何保持 RxJ 干燥

    DRY 不要重复自己 假设我在我的应用程序中经常使用以下代码 observable pipe tap value gt console log value map value gt value 5 more repeated stuff 假
  • Angular 2自定义验证器:检查输入值是否为整数?

    在 Angular2 项目中 我需要验证一些输入 如何轻松检查输入值是否为整数 我尝试使用Number control value 返回0对于空的字段 不好 or parseInt control value 10 不考虑空格 如果我有类似
  • Microsoft.TeamFoundation.VersionControl.Client.ItemNotMappedException 即使工作区存在并且具有映射

    使用 TFS 2015 update 2 在计算机中安装代理 代理创建其工作区 内部开发的一些自定义 MSBuild 任务已在将在代理上运行的生成定义中实现 这些任务针对 TFS 服务器执行一些操作 当构建定义排队等待新构建时 我得到的是
  • 将语言包嵌入到应用程序中

    我正在制作一个使用离线语音识别的应用程序 来自 Google API 的 SpeechRecognizer 它工作得很好 但我需要在使用该应用程序之前下载语言包 所以 这是我的问题 有没有办法嵌入语言包并直接从我的应用程序安装它 或者从Pl
  • 如何在Java小程序中打开模式对话框?

    我正在尝试在前面显示一个模式对话框Applet 我当前的解决方案像这样获取根框架 Frame getMyParent Container parent getParent while parent instanceof Frame pare
  • Logstash - Memorize 插件的使用

    尝试使用 记忆 插件 如下所示 if message matching event grok match gt message mymatch datetime memorize field gt datetime if message a
  • 如何使 gcc 或 ld 报告未定义的符号但不失败?

    如果你用 GCC 编译一个共享库并传递 z defs 标志 我认为它只是盲目地传递给 ld 那么你会得到一个很好的报告 说明哪些符号未定义 并且 ld 失败 没有 so 文件 被建造 另一方面 如果您不指定 z defs 或显式指定 z n
  • 两个列表之间的交集 F#

    我正在寻找一个函数 它可以获取两个列表之间的交集并创建一个新列表 我有这个函数 let intersect x y Set intersect Set ofList x Set ofList y 可以实现我想要的功能 但我不想使用 F 中的
  • C#中ArrayList的初始大小是多少?

    我想知道C 中ArrayList的初始大小是多少 0 见下文 16 我必须为此答案添加字符 因为最少 18 个字符 编辑 哎呀 最初的capacity是16 初始大小当然是0 因为它是空的 必须学会如何阅读 或者你必须学习如何提出你的问题
  • 离线时 start_url 不会响应 200:start_url 确实响应,但不是通过服务工作线程响应。灯塔审计问题

    我正在创建一个与 Service Worker 一起离线工作的 PWA 目前它工作正常 但 Lighthouse Audit 存在问题 当我运行 Lighthouse 时 在 PWA 部分我遇到这个问题 离线时 start url 不响应
  • Shiny:使 renderUI 对下拉列表做出反应,而不是对 SubmitButton 做出反应

    如何让 renderUI 对用户从下拉列表中选择不同的值做出反应 而无需单击我的提交按钮 我有一个 wellPanel 其中包含 3 个内容 1 我的下拉列表2 一组动态输入 由我的 renderUI 函数创建 取决于 1 中的选择 3 提
  • Mysql索引配置

    我有一张满是新闻的 450000 行表 表架构是这样的 CREATE TABLE IF NOT EXISTS news id int 11 NOT NULL auto increment cat id int 11 NOT NULL tit
  • 指定哪些字段在 ElasticSearch 中建立索引

    我有一个包含许多我从不查询的字段的文档 因此我想关闭这些字段的索引以节省资源 我相信我需要禁用 all field http www elasticsearch org guide reference mapping all field h
  • 返回实例列表没有什么区别吗?那么性能呢?

    我刚刚意识到 对于我的程序中的特定模块 返回或不返回实例列表根本没有区别 使用固定种子 结果是相同的 因此 我想知道 包含 return 语句似乎是更好的编程实践 那是对的吗 我主要担心的是性能 我很难计时 因为计算机中发生的其他事情似乎会
  • std::find() 在 C 风格数组上向后?

    说我需要使用s typedef struct tagSOMESTRUCT Defined by someone else C compatible int count int elements 256 SOMESTRUCT SOMESTRU