查找 C++ 向量中的成员函数

2024年8月28日 | 阅读 4 分钟

与任何其他语言中的数组类似,C++ 中的 vector 是动态的;因此其大小不是固定的。为什么要用 vector?因为 C++ 数组是静态的,定义后无法更改其宽度,这在存储大小未知的数据集时并不理想。

示例

输出

3
.........................................
Process executed in 1.22 seconds
Press any key to continue.

说明

如果元素存在于 vector 中,这段代码将返回该元素的索引;否则,它将返回 -1。

  • 第 1 行:指定的头文件包含我们所需的 locate 函数以及所有 C++ 标准库。
  • 第 2 行:我们定义了一个函数,它有两个输入:一个 vector 和一个要搜索的键。
  • 第 3 行:对于我们的 vector,我们声明了一个迭代器。它指定 vector 的内存地址。它将用于遍历 vector。本帖子末尾提供的链接可让您了解有关迭代器的更多信息。
  • 第 4 行:我们调用 std::find 方法,它将返回一个迭代器,其中包含键 k 在 vector 中的位置。
  • 第 5 至 8 行:在这里,我们进行 if 测试以确定元素是否在 vector 中。如果是,我们返回其位置;否则,我们返回 -1,表示它不存在。

为了找到我们正在寻找的键,函数调用遍历 vector 中的 n 个元素,因此时间复杂度是线性的 O(n)。

通过以恒定的 O(1) 空间复杂度迭代遍历 vector 来执行简单的比较。

借助 std::find_if() 和 std::distance()

如果搜索需要满足特定逻辑,例如使用素数逻辑在 vector 中查找元素的索引,建议使用此方法在 vector 中查找元素。

当我们的谓词(比较结构)对第一个到最后一个范围内的任何元素返回 true 时,std::find_if() 会返回一个指向该元素的迭代器。如果不存在这样的键,函数将返回 end(last),即最后一个元素的末尾。

std::distance() 返回从第一个到最后一个的跳数。在我们的情况下,它给出从 vector 开始到迭代器键 k 的跳数,这是我们正在寻找的元素的位置索引。键索引将取决于跳数。

示例

输出

3
.........................................
Process executed in 1.33 seconds
Press any key to continue.

说明

  • 第 2-8 行:我们声明了一个比较结构,它根据 int k 评估参数的值。
  • 本帖子底部提供的外部链接可让您了解有关 C++ 结构的更多信息。
  • 第 9 行:声明了一个 searchResult 函数,其输入参数是 vector 和键。
  • 第 10 行:这次,我们使用 STL 库的 find_if 方法,并传入一个以键 k 作为参数的比较结构,以及指向 vector 开头 (arr.cbegin()) 和结尾 (arr.cend()) 的常量随机访问迭代器。

下一主题智能指针