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())的常量随机访问迭代器。