如果元素存在,则获取容器中元素的索引

Posted

技术标签:

【中文标题】如果元素存在,则获取容器中元素的索引【英文标题】:Get index of element in container if element exists 【发布时间】:2020-04-06 01:55:44 【问题描述】:

我正在通过学​​习更好地使用标准库中的算法来提高我的 C++ 技能。我有一个问题,我不确定如何使用算法正确解决。我需要检查一个元素是否存在于向量中,如果存在,获取它的索引。

对于原始循环,我会使用一个整数并在每次迭代时递增它。

使用算法我只能使用std::find,然后使用std::distance,但这需要比原始循环更多的计算。使用算法完成这项任务的最佳方法是什么?

【问题讨论】:

但这需要比原始循环更多的计算 -- 你从哪里得到这些信息? 我很清楚它会做更多的事情。首先我迭代然后我计算距离...... 好的,让我们看看使用循环查找元素的完整设置。请记住,索引必须在循环体外部可用,因此for (int i..) 等“技巧”将不起作用,因为i 必须在循环外部可用。 我已经测试过了,也许我做错了什么,但看起来原始循环更便宜godbolt.org/z/HwBHDL 您的代码具有未定义的行为,因为 i 未初始化。下一个问题是你应该把你的手写代码移动到一个函数中,看看会发生什么。你基本上是在比较一个通用函数,当给定正确的参数时,总是可以工作,并且人类确保他们所有的手动编码循环都没有错误(例如,大小错误)。 【参考方案1】:

使用算法完成这项任务的最佳方法是什么?

使用std::find,然后使用std::distance

除了具有更高效的find 成员函数的容器,例如关联容器。在这种情况下,使用find 成员函数和std::distance

还有一些数据结构比通过迭代器更有效地计算距离,但没有标准容器使用这种数据结构。

但这需要比原始循环更多的计算。

它没有(假设是优化编译器)。

为什么不呢?

因为有问题的标准算法不需要做任何原始循环不做的事情。

【讨论】:

为什么不呢?至少它需要计算距离。一个优化编译器会优化到一个单一的减法假设一个向量,但仍然是一些东西。其他容器也会有问题,不是吗? 好吧,我使用两种标准算法。使用原始循环,我可以在一个循环中结合两个操作,查找和距离,不是吗? godbolt.org/z/HwBHDL @jjcasmar 您一般不能对容器使用索引循环,因为并非所有容器都具有随机访问权限。理论上,允许编译器使用与您相同的技巧来优化减法,但这几乎不重要,因为在大多数情况下,单次减法的速度非常快,因为可能存在其他瓶颈。 好吧,我就是这么想的。仍然是更多的操作,但仍然无所谓。就是想知道有没有其他办法。我想这里的清晰度更重要,使用两种算法更干净。关于您对find 成员函数的最后编辑。 std::find 不应该专门用于该特定容器来调用成员函数吗?标准容器是否专业化? @jjcasmar 底线:当优化器优化操作时,抽象机器的更多操作并不重要。

以上是关于如果元素存在,则获取容器中元素的索引的主要内容,如果未能解决你的问题,请参考以下文章

根据另一个列表元素获取一些列表元素索引

Python3 - 列表

redis常用命令--zsets

如何找到已排序容器的匹配元素的索引?

php数组操作之获取数组元素索引(键)值

迭代器失效~转载