C++11——std::all_of()


翻译来自:https://thispointer.com/c11-stdall_of-algorithm-tutorial-example/

在本文中,我们将讨论 c++11 中引入的 std::all_of() STL 算法。

需要 std::all_of()

当您有一个元素范围/数组并且想要检查给定范围内的所有元素是否满足给定条件时,此 STL 算法很有用。它与 std::any_of() 正好相反。

std::all_of() 介绍

all_of() 接受一系列元素和一个一元谓词(即回调)作为参数。

bool all_of (, , UnaryPredicate pred);

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

std::all_of() 使用细节

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

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

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

// 一个字符串向量
std::vector < std::string > wordList = { "Hi" , "Hello" , "Test" , "First" , "Second" , "Third" , "Fourth" } ;

现在我们想使用 std::all_of() 检查向量中的所有字符串是否具有相同的大小

/*
 Check if all strings in vector are of same size i.e. 4.
 */
bool result = std::all_of(wordList.begin(), wordList.end(), [](const std::string & str) {
                                                                return str.size() == 4;
                                                                });

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

现在使用 all_of() 检查向量中的所有字符串是否以大写字母开头

/*
 Check if all strings in vector starts with a Upper Case Letter
 */
result = std::all_of(wordList.begin(), wordList.end(), [](const std::string & str) {
                                                return str.size() > 0 && ::isupper(str[0]);
                                                });

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

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

std::string str = "testString" ;

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

/*
 Check if given string contains all lower case letters i.e. not a single upper case char
 */
result = std::all_of(str.begin(), str.end(), ::islower);

将 std::all_of() 与数组一起使用

假设我们有一个数组,即

int arr [] = { 3,9,75,15,12 } ;

现在我们将使用 all_of() 检查数组中的所有数字是否都是 3 的倍数,即

// 检查数组中的所有数字是否都是 3 的倍数,即
result = std::all_of(arr, arr + sizeof(arr)/ sizeof(int), [](const int & i){ return i%3 == 0; });

所以,基本上 std::all_of() 是为了让我们的生活更轻松。

#include 
#include 
#include <string>
#include 
int main()
{
    // A vector of strings
    std::vectorstring> wordList =
    { "Hi", "Hello", "Test", "First", "Second", "Third", "Fourth" };
    /*
     Check if all strings in vector are of same size i.e. 4.
     */
    bool result = std::all_of(wordList.begin(), wordList.end(), [](const std::string& str) {
        return str.size() == 4;
        });
    std::cout << " Is Vector contains all string with size 4 ? | Result = " << result << std::endl;
    /*
     Check if all strings in vector starts with a Upper Case Letter
     */
    result = std::all_of(wordList.begin(), wordList.end(), [](const std::string& str) {
        return str.size() > 0 && ::isupper(str[0]);
        });
    std::cout << "Are all strings in vector starts with a Upper Case Letter ? | 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::all_of(str.begin(), str.end(), ::islower);
    std::cout << "str  = " << str << std::endl;
    std::cout << "Does given string contains all lower case letters ? | Result = " << result << std::endl;
    // Using all_of() with array
    int arr[] = { 3,9,75,15,12 };
    // Check if all numbers in array are multiple of 3 i.e.
    result = std::all_of(arr, arr + sizeof(arr) / sizeof(int), [](const int& i) { return i % 3 == 0; });
    std::cout << "Does all numbers in array are multiple of 3 | Result = " << result << std::endl;
    return 0;
}
 Is Vector contains all string with size 4 ? | Result = 0
Are all strings in vector starts with a Upper Case Letter ? | Result = 1
str  = testString
Does given string contains all lower case letters ? | Result = 0
Does all numbers in array are multiple of 3 | Result = 1