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

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

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

示例:

#include < bits / stdc++.h >
#include < stdlib >
#include < stdio.h >
#include < vector >
#include < conio.h >
int searchResult ( std : : vector < int > arr , int k ) { 
    std : : vector < int > : : iterator it ;
    it = std : : find ( arr . begin ( ) , arr . end ( ) , k ) ;
    if ( it ! = arr . end ( ) )
        return ( it - arr . begin ( ) ) ;
    else
        return -1 ;
}
int main ( ) {
    std : : vector < int > arr = { 1 , 2 , 3 , 4 , 5 , 6 } ;
    int k = 4 ;
    std : : cout << searchResult ( arr , k ) << std : : endl ;
    return 0 ;
}

输出:

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

解释

如果元素在向量中存在,则此代码返回元素的索引;否则,返回-1。

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

函数调用在向量中的n个元素上运行,以定位我们正在寻找的关键字,因此时间复杂度是线性的O(n)。

通过迭代以常数O(1)空间复杂度在向量上执行简单的比较。

利用std::find_if()和std::distance()的帮助

如果搜索需要满足特定的逻辑,示例使用质数逻辑在向量中查找元素的索引,建议使用这种方法在向量中查找元素。

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

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

示例:

# include < bits / stdc++.h >
struct compare {
    int k ;
    compare ( int const & i ) : k ( i ) { }
    bool operator ( ) ( int const & i ) {
        return ( i = = k ) ;
    }
} ;
int searchResult ( std : : vector < int > arr , int k ) {
    auto itr = std : : find_if ( arr . cbegin ( ) , arr . cend ( ) , compare ( k ) ) ;
    if ( itr ! = arr . cend ( ) )
        return std : : distance ( arr . cbegin ( ) , itr ) ;
    return -1 ;
}
int main ( ) {
    std : : vector < int > arr = { 1 , 2 , 3 , 4 , 5 , 6 } ;
    int k = 4 ;
    std : : cout << searchResult ( arr , k ) << std : : endl ;
    return 0 ;
}

输出结果:

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

说明

  • 第2-8行:我们声明了一个compare结构,它将参数的值与int k进行比较。
  • 此帖子底部提供的外部链接可以让您了解更多关于C++结构的知识。
  • 第9行:声明了一个searchResult函数,其输入参数是一个向量和一个关键字。
  • 第10行:这次我们使用STL库的find if方法,并将关键字k作为参数传递给比较结构,以及指向向量开头(arr.cbegin())和结尾(arr.cend())的常量随机访问迭代器。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程