在C++中如何通过向量的数据获取向量的索引?

2024-01-12

假设我有一个vector<node>包含 10000 个对象:

vect[0] to vect[9999]

struct node
{
    int data;
};

假设我想找到包含此数据(“444”)的向量 id,它恰好位于节点 99 中。

我真的必须做一个for-loop 循环遍历所有元素然后使用

if (data == c[i].data)

或者有更快的方法吗?考虑到我的数据是独特的并且不会在其他数据中重复nodes.


对于这个答案,我假设你已经做了使用的明智决定std::vector超过其他可用容器 https://stackoverflow.com/questions/471432/in-which-scenario-do-i-use-a-particular-stl-container/471461#471461.

我真的需要执行 for 循环来循环所有元素吗?

不,您不必滚动for-循环查找元素。在容器中查找元素的惯用方法是使用标准库中的算法。不管你should自己动手确实取决于具体情况。

为了帮助您决定...

替代方案 1:

std::find() http://en.cppreference.com/w/cpp/algorithm/find要求有一个适合您的相等比较器node数据类型,可能像这样简单:

bool operator ==(node const& l, node const& r)
{
    return l.data == r.data;
}

然后,给定一个required node,您可以搜索该元素。这会返回一个iterator (or a pointer如果您使用的是普通的旧数组)。如果您需要index,这需要一点计算:

auto i = std::find(v.begin(), v.end(), required);
if (i != v.end())
{
    std::cout << i->data << " found at index " << i - v.begin() << std::endl;
}
else
{
    std::cout << "Item not found" << std::endl;
}

替代方案 2:

如果创建一个node太昂贵或者你没有相等运算符,更好的方法是使用std::find_if() http://en.cppreference.com/w/cpp/algorithm/find,它需要一个谓词(这里我使用 lambda 因为它很简洁,但你可以使用像这个答案一样的函子 https://stackoverflow.com/a/14919397/78845):

// Alternative linear search, using a predicate...
auto i = std::find_if(v.begin(), v.end(), [](node const& n){return n.data == 444;});
if (i != v.end())
{
    std::cout << i->data << " found at index " << i - v.begin() << std::endl;
}
else
{
    std::cout << "Item not found" << std::endl;
}

或者有更快的方法吗?

同样,这取决于情况。std::find() and std::find_if()以线性时间运行(O(n)),和你的一样for-loop.

也就是说,使用std::find() or std::find_if()不会涉及随机访问或对容器进行索引(它们使用迭代器),但与您的相比,它们可能需要一些额外的代码for-loop.

替代方案 3:

如果运行时间很关键并且您的数组已排序(比如std::sort() http://en.cppreference.com/w/cpp/algorithm/sort),您可以执行二分搜索,该搜索以对数时间运行(O(log n)). std::lower_bound() http://en.cppreference.com/w/cpp/algorithm/lower_bound实现对第一个元素的二分搜索不小于给定值。不幸的是,它不需要谓词,但需要一个适合您的小于比较器node数据类型,例如:

bool operator <(node const& l, node const& r)
{
    return l.data < r.data;
}

调用类似于std::find()并返回一个iterator,但需要额外检查:

auto i = std::lower_bound(v.begin(), v.end(), required);
if (i != v.end() && i->data == required.data)
{
    std::cout << i->data << " found at index " << i - v.begin() << std::endl;
}
else
{
    std::cout << "Item not found" << std::endl;
}

这些函数来自算法库 http://en.cppreference.com/w/cpp/algorithm与任何提供迭代器的容器一起使用,因此切换到另一个容器std::vector将快速且易于测试和维护。

决定权在你!

[请参阅此处的演示。] http://ideone.com/WLXXFg

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

在C++中如何通过向量的数据获取向量的索引? 的相关文章

随机推荐

  • 无法将关键字“用户名”解析为字段。选项有:城市、身份证、电话等

    我想就这些问题寻求帮助 我确实知道这似乎与同一问题的其他问题相似 但我环顾四周 发现没有什么可以真正解决我的问题 顺便说一句 这是我第二次在这里提问 所以请告诉我这条消息是否太长 谢谢 我将 AllAuth 与 Django 1 8 和 P
  • 如何为postgresql中的所有表创建触发器?

    我有一个触发器 但我需要与我的 postgres 的所有表关联 有下面这样的命令吗 CREATE TRIGGER delete data alldb BEFORE DELETE ON ALL DATABASE FOR EACH ROW EX
  • 将 UILabel 文本设置为粗体[重复]

    这个问题在这里已经有答案了 如何设置文本UILabel以编程方式在 Swift 中加粗 到目前为止我的代码 var label UILabel frame theFrame label text Foo Use font的财产UILabel
  • 带有徽标图像的 django pdf

    我使用比萨创建了发票 Pdf 文本模板 但我想在 pdf 文件中显示徽标 图像 以及文本 我不知道如何在 pdf 中显示图像 我的看法如下 def generate invoice request user id None personal
  • 在 .NET Core 中将 HTML 转换为图像

    我想在 Web 服务器上将 HTML 代码转换为图像 png jpg 然后在我的 NET Core 应用程序中通过电子邮件发送图像链接 我不想购买任何第三方库 如 NReco 或 EVo 还有其他方法可以在 dotnet core 2 0
  • 有没有一种方法可以仅使用 javascript 命令来选择图像并将其复制到剪贴板?

    我想复制图像本身而不是任何文本或相关的 src 我做了一个 jsfiddle 的例子https jsfiddle net pvuefca7 1 https jsfiddle net pvuefca7 1 您可以尝试一下 发现复制文本效果很好
  • 如何在 Formik 上实现自定义 handleChange 函数?

    在输入元素中 handleChange 函数将从 onChange 事件接收事件对象 如何为如下非输入字段创建自定义 handleChange 函数 import React from react import useFormik from
  • 如何使用 XCTest 从 iOS 13 删除/重置应用程序?

    最近我开始使用 XCTest 测试 iOS 应用程序 但我发现了一些困难 主要困难是删除或重置每个测试类中的应用程序内容 我目前正在使用 XCode 11 并尝试从 iOS 13 中为每个测试类删除 重置应用程序 我已经尝试过 通过跳板删除
  • 在 adMob 中仅显示文字广告

    我已将我的 adMob 帐户更新到新版本 我只想在我的应用中显示文字广告 我如何使用新版本的 adMob 帐户做到这一点 或者 如何在新版本的 adMob 帐户中屏蔽图片广告 这可以在您的 AdMob 帐户上完成 去 AdMob gt 获利
  • 检查是否在 mySQL 的多个列之一中找到字符串

    我需要检查是否在一列或多列中找到字符串 基本上 我有一个程序可以让你检查多个字段 姓名 姓氏等 如果同时检查姓名并且用户仅输入姓名 例如 chris 则可以很容易地在 mySQL 中使用 LIKE 参数进行检查 如下所示 select fr
  • 统一访问Web服务

    我有三个 Web 服务 它们是由三个不同的供应商开发的 并且具有不同的 URL 输入参数和输出参数 它们都是 ASMX Web 服务 它们用于从第三方关系数据库中删除记录 例如我提供一个 personID 然后一个人就会从一个系统中删除 并
  • SharePoint 错误:找不到 xxxx 的 Web 应用程序

    当我尝试执行这段代码时 SPSite siteCollection new SPSite http sp devxxx 10000 它抛出以下错误 Web 应用程序位于http sp devxxx 10000 http sp devxxx
  • 从不正确的 .Rbuildignore 文件构建后,包中的整理字段中的文件丢失

    我的包的其中一个函数在构建时拒绝添加到包源中 然后在运行 R CMD 检查时失败 我的包位于github上here https github com eshilts dc crime data 文件calculate latitude an
  • 迭代 C 数组

    我有一个在程序中某处创建的结构数组 后来 我想迭代它 但我没有数组的大小 如何迭代元素 或者我需要将尺寸存储在某处吗 如果在编译时已知数组的大小 则可以使用结构大小来确定元素的数量 struct foo fooarr 10 for i 0
  • 如何解决 Arango 查询承诺错误? [复制]

    这个问题已经存在了 我一直在尝试使用肥皂消息从 Arangodb 获取查询结果到我的前端服务 Angular 4 我能够获得查询结果 但在 console log 中打印出来 但是我如何在这个功能 Service 下获取它 这样我就可以输入
  • 如何在 React Native 中创建聊天气泡的卷曲箭头/尾部

    我目前正在用反应本机制作聊天气泡 由于我是反应原生的新手 我首先尝试在浏览器上制作聊天气泡 然后尝试在反应原生中复制相同的内容 我正在努力复制反应本机中的箭头 有什么想法 建议吗 普通 HTML CSS div p class to me
  • 使用 boost asio 进行多线程 http 处理是否需要线程?

    在Boost asio中股线文档 https www boost org doc libs 1 78 0 doc html boost asio overview core strands html它说 链可以是隐式的也可以是显式的 如以下
  • 如何确保你的计算图是可微的

    一些 Tensorflow 操作 例如tf argmax 是不可微分的 即在反向传播中不计算和使用梯度 一个答案Tensorflow 哪些操作是可微分的 哪些操作是不可微分的 https stackoverflow com question
  • Django 在模板中渲染动态图像

    在 Django 视图中 我可以生成动态图像 PNG 格式的图形 并创建一个响应 该响应是我的图形的图像 我可以让它在浏览器中显示 但没有网页 它只是图像 现在我想将此图像嵌入 HTML 模板中并渲染它 我怎样才能做到这一点 这是我的第一个
  • 在C++中如何通过向量的数据获取向量的索引?

    假设我有一个vector