当前位置:   article > 正文

c++---find()函数_c++ find

c++ find

1. string类的find函数

string 类的 find() 函数用于在字符串中查找子串或字符。它有多种重载形式,可以用于查找不同类型的子串或字符。
下面是 find() 函数的几种常用形式:

size_t find (const string& str, size_t pos = 0) const;
size_t find (const char* s, size_t pos = 0) const;
size_t find (const char* s, size_t pos, size_t n) const;
size_t find (char c, size_t pos = 0) const;
  • 1
  • 2
  • 3
  • 4

其中,str为要查找的子串;s为要查找的字符数组;c为要查找的字符;pos为查找的起始位置;n为要查找的字符个数。
如果查找成功,find()函数返回子串或字符在字符串中第一次出现的位置;否则,返回一个特殊值string::npos,表示查找失败。
下面这段代码演示了如何使用find()函数在字符串中查找子串或字符:

#include <iostream>
#include <string>
 
int main()
 {
    std::string str = "Hello, world!";
    std::cout << str.find("world") << '\n';   // 输出7
    std::cout << str.find('w') << '\n';       // 输出7
    std::cout << str.find("abc") << '\n';     // 输出18446744073709551615(即string::npos)
}
//上面的代码会在控制台输出 “ 7 7 18446744073709551615 ”。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

注意事项
在使用string类的find()函数时,有几点需要注意:

  1. find()函数返回的是一个无符号整数(size_t类型),如果查找失败,它会返回一个特殊值string::npos。由于string::npos的值为-1,因此如果你直接输出find()函数的返回值,可能会看到一个很大的数字(无符号整数的最大值)。如果你想让程序输出-1,可以使用强制类型转换将返回值转换为有符号整数(如int类型)。
  2. find()函数只能查找子串或字符在字符串中第一次出现的位置。如果你想查找子串或字符在字符串中所有出现的位置,可以使用循环结构和find()函数的第二个参数(查找起始位置)实现。
  3. find()函数是区分大小写的。如果你想忽略大小写进行查找,可以先将字符串和子串都转换为小写或大写,然后再使用find()函数进行查找。

find_last_of() & find_first_of

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, world!";
    std::string chars = "o!";
    
    // 使用 find_last_of 查找最后一个匹配 chars 中任意一个字符的位置
    size_t pos = str.find_last_of(chars);
    
    if (pos != std::string::npos) {
        std::cout << "last position: " << pos << std::endl;
    } else {
        std::cout << "no result." << std::endl;
    }
    
    // 使用 std::find_first_of 查找第一个匹配 chars 中任意一个字符的位置
    auto result = std::find_first_of(str.begin(), str.end(), chars.begin(), chars.end());
    if (result != str.end()) {
        std::cout << "first position: " << std::distance(str.begin(), result) << std::endl;
    } else {
        std::cout << "no result." << std::endl;
    }
    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

通过检查pos是否等于std::string::npos来判断是否找到了匹配的字符。如果找到了,输出匹配字符的位置,否则输出没有找到匹配的字符。
在这里插入图片描述

2. < algorithm >下的 find 函数

find() 函数本质上是一个模板函数,用于在指定范围内查找和目标元素值相等的第一个元素。
如下为 find() 函数的语法格式:

InputIterator find (InputIterator first, InputIterator last, const T& val);
  • 1

其中,first 和 last 为输入迭代器,[first, last) 用于指定该函数的查找范围;val 为要查找的目标元素。
正因为 first 和 last 的类型为输入迭代器,因此该函数适用于所有的序列式容器。
另外,该函数会返回一个输入迭代器,当 find() 函数查找成功时,其指向的是在 [first, last) 区域内查找到的第一个目标元素;如果查找失败,则该迭代器的指向和 last 相同。
值得一提的是,find() 函数的底层实现,其实就是用 == 运算符将 val 和 [first, last) 区域内的元素逐个进行比对。这也就意味着,[first, last) 区域内的元素必须支持 == 运算符。

举个例子:

#include <iostream>     
#include <algorithm>    
#include <vector>       

int main() {
    std::vector<std::string> myvector{ "www", "baidu", "com" };
    auto it = find(myvector.begin(), myvector.end(), "com");
    if (it != myvector.end())
        std::cout << "result: " << *it << std::endl;
    else
        std::cout << "no result." << std::endl;
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在这里插入图片描述

3. C++ find_if()函数

和 find() 函数相同,find_if() 函数也用于在指定区域内执行查找操作。不同的是,前者需要明确指定要查找的元素的值,而后者则允许自定义查找规则。
所谓自定义查找规则,实际上指的是有一个形参且返回值类型为 bool 的函数。值得一提的是,该函数可以是一个普通函数(又称为一元谓词函数),比如:

bool mycomp(int i) {  
    return ((i % 2) == 1);
}
  • 1
  • 2
  • 3

确切地说,find_if() 函数会根据指定的查找规则,在指定区域内查找第一个符合该函数要求(使函数返回 true)的元素。
find_if() 函数的语法格式如下:

InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred);
  • 1

其中,first 和 last 都为输入迭代器,其组合 [first, last) 用于指定要查找的区域;pred 用于自定义查找规则。
值得一提的是,由于 first 和 last 都为输入迭代器,意味着该函数适用于所有的序列式容器。甚至当采用适当的谓词函数时,该函数还适用于所有的关联式容器(包括哈希容器)。
同时,该函数会返回一个输入迭代器,当查找成功时,该迭代器指向的是第一个符合查找规则的元素;反之,如果 find_if() 函数查找失败,则该迭代器的指向和 last 迭代器相同。

举个例子:

#include <iostream>     
#include <algorithm>    
#include <vector>       

//自定义一元谓词函数
bool mycomp(int i) {    
    return ((i % 2) == 1);
}
//以函数对象的形式定义一个 find_if() 函数的查找规则
class mycomp2 {
public:    
    bool operator()(const int& i) {        
        return ((i % 2) == 1);    
    }
};
int main() {    
    std::vector<int> myvector{ 4,2,3,1,5 };    //调用 find_if() 函数,并以 IsOdd() 一元谓词函数作为查找规则    
    auto it = find_if(myvector.begin(), myvector.end(), mycomp2());    
    std::cout << "*it = " << *it;    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

程序执行结果为:

*it = 3
  • 1

std::find_if 是 C++ 标准库中的一个算法函数,用于在指定范围内查找满足特定条件的元素,并返回第一个满足条件的元素的迭代器。它的声明位于 < algorithm > 头文件中。
函数原型如下:

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );
  • 1
  • 2

参数解释:

  • first 和 last 定义了查找范围,表示要在 [first, last) 区间内查找。
  • p 是一个一元谓词(Unary Predicate),是一个可调用对象(函数、函数指针、函数对象等),接受一个参数并返回 bool 类型的值。查找过程中,对于每个元素,p 会被调用一次,如果返回 true,则该元素满足条件,查找成功。
    返回值:
    如果找到满足条件的元素,则返回指向该元素的迭代器。
    如果未找到满足条件的元素,则返回 last。
#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};

    // 查找第一个大于 5 的元素
    auto it = std::find_if(numbers.begin(), numbers.end(), [](int x) {
        return x > 5;
    });

    if (it != numbers.end()) {
        std::cout << "Found element greater than 5: " << *it << std::endl;
    } else {
        std::cout << "No element greater than 5 found." << std::endl;
    }
   
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

结合程序执行结果不难看出,对于 myvector 容器中的元素 4 和 2 来说,它们都无法使 (i%2)==1 这个表达式成立,因此 mycomp2() 返回 false;而对于元素 3 来说,它可以使 mycomp2() 函数返回 true,因此,find_if() 函数找到的第一个元素就是元素 3。
值得一提的是,C++ STL find_if()官网给出了 find_if() 函数底层实现的参考代码(如下所示):

template<class InputIterator, class UnaryPredicate>
InputIterator find_if (InputIterator first, InputIterator last, UnaryPredicate pred){    
    while (first!=last) {        
        if (pred(*first)) return first;        
        ++first;    
    }    
    return last;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

4. C++ find_if_not()函数

find_if_not() 函数和 find_if() 函数的功能恰好相反,通过上面的学习我们知道,find_if() 函数用于查找符合谓词函数规则的第一个元素,而 find_if_not() 函数则用于查找第一个不符合谓词函数规则的元素。

find_if_not() 函数的语法规则如下所示:

InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred);
  • 1

`其中,first 和 last 都为输入迭代器,[first, last) 用于指定查找范围;pred 用于自定义查找规则。
和 find_if() 函数一样,find_if_not() 函数也适用于所有的容器,包括所有序列式容器和关联式容器。
同样,该函数也会返回一个输入迭代器,当 find_if_not() 函数查找成功时,该迭代器指向的是查找到的那个元素;反之,如果查找失败,该迭代器的指向和 last 迭代器相同。
举个例子:

#include <iostream>     
#include <algorithm>    
#include <vector>       

//自定义一元谓词函数
bool mycomp(int i) {    
    return ((i % 2) == 1);
}
int main() {    
    std::vector<int> myvector{4,2,3,1,5};    
    //调用 find_if() 函数,并以 mycomp() 一元谓词函数作为查找规则    
    auto it = find_if_not(myvector.begin(), myvector.end(), mycomp);    
    std::cout << "*it = " << *it;    
    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

在这里插入图片描述

程序执行结果为:

*it = 4
  • 1

可以看到,由于第一个元素 4 就不符合 (i%2)==1,因此 find_if_not() 成功找到符合条件的元素,并返回一个指向该元素的迭代器。
find_if_not() 函数的底层实现和 find_if() 函数非常类似,C++ STL find_if_not()官网给出了该函数底层实现的参考代码:

template<class InputIterator, class UnaryPredicate>
InputIterator find_if_not (InputIterator first, InputIterator last, UnaryPredicate pred){    
    while (first!=last) {        
        if (!pred(*first)) return first;        
        ++first;    
    }    
    return last;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

5. map和vector的find

std::map 和 std::vector 是 C++ 中常用的容器,它们都提供了 find() 函数用于查找元素。
5.1 map 的 find() 函数
std::map 是一个有序键值对的容器,find() 函数用于在 std::map 中根据键查找对应的值。find() 函数返回一个指向匹配元素的迭代器,如果找不到匹配的元素,则返回指向 std::map 末尾的迭代器 end()。
用法示例:

#include <iostream>
#include <map>

int main() {
    std::map<int, std::string> myMap;

    myMap[1] = "apple";
    myMap[2] = "banana";
    myMap[3] = "orange";

    // 查找键为2的元素
    auto it = myMap.find(2);
    if (it != myMap.end()) {
        std::cout << "Found: " << it->second << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出结果:

Found: banana
  • 1

5.2 vector的find()函数
std::vector 是一个动态数组的容器,find() 函数用于在 std::vector 中查找指定元素。find() 函数返回一个指向匹配元素的迭代器,如果找不到匹配的元素,则返回指向 std::vector 末尾的迭代器 end()。
用法示例:

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> myVector {1, 2, 3, 4, 5};

    // 查找值为3的元素
    auto it = std::find(myVector.begin(), myVector.end(), 3);
    if (it != myVector.end()) {
        std::cout << "Found: " << *it << std::endl;
    } else {
        std::cout << "Not found" << std::endl;
    }

    return 0;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出结果:

Found: 3
  • 1

std::map 和 std::vector 中的 find() 函数原理:

  • std::map 的底层是通过红黑树实现的,查找元素的时间复杂度为 O(log N),其中 N 是 std::map 中元素的个数。
  • std::vector 的底层是一个连续的内存区域,查找元素需要遍历整个容器,时间复杂度为 O(N),其中 N 是 std::vector 中元素的个数。

通过 find() 函数,可以方便地在 std::map 或 std::vector 容器中查找所需的元素,并对其进行相应的操作。
如有疏漏,还请海涵。

年年岁岁花相似,岁岁年年人不同。
只愿君心似我心,定不负相思意。
2024年3月20日21:27:23

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号