📜  C++ STL中的数组算法(all_of,any_of,none_of,copy_n和iota)(1)

📅  最后修改于: 2023-12-03 14:59:47.202000             🧑  作者: Mango

C++ STL中的数组算法

在C++的标准模板库(STL)中,提供了一系列针对数组的算法,用于对数组进行操作和处理。这些算法包括all_ofany_ofnone_ofcopy_niota,本文将逐一介绍它们的用法和特点。

all_of

all_of算法用于判断给定区间内的所有元素是否都满足一个特定的条件。其函数原型如下:

template <class InputIt, class UnaryPredicate>
bool all_of(InputIt first, InputIt last, UnaryPredicate p);

其中,firstlast表示输入区间的起始和终止迭代器,p是一个一元谓词(即接受一个参数并返回bool类型的函数对象)。all_of函数返回一个布尔值,如果区间内的所有元素都满足p的条件,则返回true,否则返回false

下面是一个使用all_of算法的示例代码:

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

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

    bool allPositive = std::all_of(numbers.begin(), numbers.end(), [](int num) {
        return num > 0;
    });

    if (allPositive)
    {
        std::cout << "All numbers are positive" << std::endl;
    }
    else
    {
        std::cout << "Some numbers are not positive" << std::endl;
    }

    return 0;
}

上述代码判断了一个包含整数的向量中的所有元素是否都大于零。通过自定义一个lambda表达式作为谓词,判断每个元素是否大于零,从而得到最终的判断结果。

any_of

any_of算法用于判断给定区间内的任意一个元素是否满足一个特定的条件。其函数原型如下:

template <class InputIt, class UnaryPredicate>
bool any_of(InputIt first, InputIt last, UnaryPredicate p);

any_of函数的参数和返回值与all_of函数相似。区别在于,any_of函数返回一个布尔值,如果区间内至少有一个元素满足p的条件,则返回true,否则返回false

以下是一个使用any_of算法的例子:

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

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

    bool hasNegative = std::any_of(numbers.begin(), numbers.end(), [](int num) {
        return num < 0;
    });

    if (hasNegative)
    {
        std::cout << "The vector contains negative numbers" << std::endl;
    }
    else
    {
        std::cout << "The vector does not contain negative numbers" << std::endl;
    }

    return 0;
}

上述代码判断了一个包含整数的向量中是否存在负数。同样利用lambda表达式作为谓词,判断每个元素是否小于零,以确定最终的结果。

none_of

none_of算法用于判断给定区间内的所有元素是否都不满足一个特定的条件。其函数原型如下:

template <class InputIt, class UnaryPredicate>
bool none_of(InputIt first, InputIt last, UnaryPredicate p);

none_of函数的参数和返回值与all_ofany_of函数类似。不同之处在于,none_of函数返回一个布尔值,如果区间内的所有元素都不满足p的条件,则返回true,否则返回false

以下是一个使用none_of算法的示例代码:

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

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

    bool noneNegative = std::none_of(numbers.begin(), numbers.end(), [](int num) {
        return num < 0;
    });

    if (noneNegative)
    {
        std::cout << "All numbers are non-negative" << std::endl;
    }
    else
    {
        std::cout << "Some numbers are negative" << std::endl;
    }

    return 0;
}

上述代码判断了一个包含整数的向量中的所有元素是否都大于等于零。通过自定义一个lambda表达式作为谓词,判断每个元素是否小于零,从而得到最终的判断结果。

copy_n

copy_n算法用于将一个给定区间内的元素复制到另一个区间,并返回复制的元素个数。其函数原型如下:

template <class InputIt, class Size, class OutputIt>
OutputIt copy_n(InputIt first, Size count, OutputIt result);

其中,first表示输入区间的起始迭代器,count表示要复制的元素个数,result表示输出的目标区间的起始迭代器。copy_n函数返回一个迭代器,指向输出区间中的最后一个复制的元素的下一个位置。

下面是一个使用copy_n算法的示例代码:

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

int main()
{
    std::vector<int> source{1, 2, 3, 4, 5};
    std::vector<int> destination(3); // 目标区间大小需要足够容纳复制的元素

    std::copy_n(source.begin(), 3, destination.begin());

    // 输出目标区间中的元素
    for (const auto& num : destination)
    {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

上述代码从一个包含整数的向量中复制了前三个元素到另一个向量中。注意,要确保目标区间的大小足够容纳复制的元素。

iota

iota算法用于为给定区间赋值连续递增的数值序列。其函数原型如下:

template <class ForwardIt, class T>
void iota(ForwardIt first, ForwardIt last, T value);

firstlast表示要赋值的区间的起始和终止迭代器,value表示起始的数值。iota函数会将valuevalue+1value+2等依次赋值给区间内的元素。

以下是一个使用iota算法的示例代码:

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

int main()
{
    std::vector<int> numbers(5); // 区间大小需要足够容纳生成的数值序列

    std::iota(numbers.begin(), numbers.end(), 1);

    // 输出区间中的元素
    for (const auto& num : numbers)
    {
        std::cout << num << " ";
    }
    std::cout << std::endl;

    return 0;
}

上述代码生成了一个包含了1到5连续递增数值的向量。注意,要确保区间的大小足够容纳生成的数值序列。

以上就是C++ STL中的数组算法all_ofany_ofnone_ofcopy_niota的介绍和示例代码。这些算法提供了方便快捷的方式来处理和操作数组,能够提高代码的可读性和效率。