如果元素存在,则获取容器中元素的索引
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 底线:当优化器优化操作时,抽象机器的更多操作并不重要。以上是关于如果元素存在,则获取容器中元素的索引的主要内容,如果未能解决你的问题,请参考以下文章