C++11——std::any_of,

在本文中,我们将讨论如何将 STL 算法 std::any_of() 与 lambda 函数和函数指针一起使用。

std::any_of 是 C++11 中引入的 STL 算法。

需要 std::any_of()

当您有一个元素范围并且想要检查范围中的任何给定元素是否满足给定条件时,此 STL 算法很有用。

std::any_of() 使用细节

std::any_of() 接受元素范围和一元谓词(回调)作为参数。

bool any_of ( InputIterator start, InputIterator end, UnaryPredicate callback ) ;

std::any_of() 在给定的范围内迭代,并为每个元素调用给定的回调,即一元谓词。如果对于任何元素,则给定的谓词返回 true,则停止进一步迭代并返回 true,否则返回 false。

std::any_of() 示例

如何将 std::any_of() 与两种不同类型的回调(即 Lambda 函数和函数指针)一起使用。

将 std::any_of() 与 Lambda 函数一起使用

假设我们有一个字符串向量,即

std::vector<std::string> vecOfStrs =
    { "Hi", "Hello", "test", "first", "second", "third", "fourth" };

现在我们要检查这个向量是否包含任何大小为 4 的字符串。让我们使用 std::any_of() 来做到这一点,即

/*
Check if vector contains any string with size 4.
*/
bool result = std::any_of(vecOfStrs.begin(), vecOfStrs.end(), [](const std::string & str){
                                                        return str.size() == 4;
                                                        });

std::any_of() 将遍历 vector 中的所有字符串,并且对于 vector 中的每个字符串,它调用传递的 lambda 函数,该函数检查字符串的大小是否为 4。如果对于任何字符串,则 lambda 函数返回 true,std::any_of () 将停止进一步的迭代并返回真,否则返回假。

现在检查上面的向量是否包含任何以 char 'P' 开头的字符串,即

/*
 Check if vector contains any string that starts with char 'P'
 */
result = std::any_of(vecOfStrs.begin(), vecOfStrs.end(), [](const std::string & str) {
                                                        return str.size() > 0 && str[0] == 'P';
                                                    });

将 std::any_of() 与函数指针一起使用

假设我们有一个字符串,即

std::string str = "testString" ;

现在让我们检查给定的字符串是否包含所有小写字母,即不是单个大写字符,即

/*
 Check if given string contains all lower case letters i.e. not a single upper case char
 */
result = std::any_of(str.begin(), str.end(), ::isupper);
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
int main()
{
    std::vector<std::string> vecOfStrs =
    { "Hi", "Hello", "test", "first", "second", "third", "fourth" };
    /*
     Check if vector contains any string with size 4.
     */
    bool result = std::any_of(vecOfStrs.begin(), vecOfStrs.end(), [](const std::string& str) {
        return str.size() == 4;
        });
    std::cout << "vector contains any string with size 4 | Result = " << result << std::endl;
    /*
     Check if vector contains any string that starts with char 'P'
     */
    result = std::any_of(vecOfStrs.begin(), vecOfStrs.end(), [](const std::string& str) {
        return str.size() > 0 && str[0] == 'P';
        });
    std::cout << "vector contains any string that starts with char 'P' | Result = " << result << std::endl;
    std::string str = "testString";
    /*
     Check if given string contains all lower case letters i.e. not a single upper case char
     */
    result = std::any_of(str.begin(), str.end(), ::isupper);
    std::cout << "str  = " << str << std::endl;
    std::cout << "Check if given string contains all lower case letters | Result = " << result << std::endl;
    return 0;
}
vector contains any string with size 4 | Result = 1
vector contains any string that starts with char 'P' | Result = 0
str  = testString
Check if given string contains all lower case letters | Result = 1