首页 > 编程语言 >c++ day 4

c++ day 4

时间:2023-07-08 22:12:30浏览次数:30  
标签:std 函数 自定义 int c++ accumulate include day

今天来复习标准模板库

当谈到C++的标准库时,STL(Standard Template Library,标准模板库)是一个重要的组成部分。STL提供了一组通用的模板类和函数,用于实现常见的数据结构和算法。它包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(Function Objects)等。

第一个STL算法:

std::accumulate 是 C++ 标准库中的一个算法函数,它用于计算指定范围内元素的累加值。std::accumulate 函数位于 <numeric> 头文件中。

函数原型如下: 

template<class InputIt, class T> T accumulate(InputIt first, InputIt last, T init); 

这里的 firstlast 是迭代器,指定了范围的起始和结束位置(左闭右开区间),init 是初始值,用于指定累加的起始值。

std::accumulate 函数会遍历指定范围内的元素,并将它们累加起来。它使用加法操作符将每个元素依次加到累加器上,并返回最终的累加结果。

以下是一个使用 std::accumulate 函数的示例:

#include <iostream>
#include <numeric>
#include <vector>

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

    int sum = std::accumulate(numbers.begin(), numbers.end(), 0);

    std::cout << "Sum: " << sum << std::endl;

    return 0;
}

 

在上面的示例中,我们定义了一个整数向量 numbers,其中包含了一些整数。然后,我们使用 std::accumulate 函数计算了向量中所有元素的累加和,并将结果存储在变量 sum 中。最后,我们将结果打印到标准输出流中。

在这个示例中,我们将初始值 0 传递给 std::accumulate 函数作为累加的起始值。函数会将初始值与向量中的每个元素相加,最终得到累加和。

你还可以根据需要自定义二元操作符来改变累加的行为。例如,你可以传递一个乘法操作符来计算累乘值。

下面是一个示例,演示如何使用自定义的乘法操作符来计算一组数字的累乘值:

#include <iostream>
#include <numeric>
#include <vector>

// 自定义乘法操作符
struct Multiply {
    template <typename T>
    T operator()(const T& x, const T& y) const {
        return x * y;
    }
};

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

    // 使用自定义的乘法操作符计算累乘值
    int product = std::accumulate(numbers.begin(), numbers.end(), 1, Multiply());

    std::cout << "Product: " << product << std::endl;

    return 0;
}

在上述示例中,我们定义了一个名为 Multiply 的函数对象结构体,它重载了圆括号操作符(即函数调用操作符)。在 operator() 函数中,我们执行了乘法操作,并返回结果。

然后,我们创建了一个整数向量 numbers,其中包含了一组数字。接下来,在调用 std::accumulate 函数时,将自定义的乘法操作符 Multiply 作为第四个参数传递给函数。这样,std::accumulate 将使用乘法操作符来执行累乘运算,将向量中的元素依次相乘,并返回最终的累乘结果。

最后,我们将累乘结果打印到标准输出流中。

通过自定义二元操作符,你可以根据需要改变 std::accumulate 的行为,使其执行不同的累加、累乘或其他操作。你只需定义一个函数对象或函数,然后将其作为参数传递给 std::accumulate 函数即可。

 

下面来学习std::copystd::next_permutation

这两位都是 C++ 标准库中的算法函数,用于不同的操作。

  1. std::copystd::copy 用于将一个容器(或数组)中的元素复制到另一个容器(或数组)中。它位于 <algorithm> 头文件中。

函数原型如下:

template<class InputIt, class OutputIt>
OutputIt copy(InputIt first, InputIt last, OutputIt d_first);

firstlast 是输入范围的迭代器,指定了要复制的元素范围。d_first 是输出范围的迭代器,指定了复制元素的目标位置。

以下是一个使用 std::copy 的示例:

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <vector>
 4 
 5 int main() {
 6     std::vector<int> source = {1, 2, 3, 4, 5};
 7     std::vector<int> destination(source.size());
 8 
 9     std::copy(source.begin(), source.end(), destination.begin());
10 
11     for (int num : destination) {
12         std::cout << num << " ";
13     }
14     std::cout << std::endl;
15 
16     return 0;
17 }

在上面的示例中,我们有一个源向量 source,并创建了一个目标向量 destination,它的大小与源向量相同。然后,我们使用 std::copy 函数将源向量中的元素复制到目标向量中。最后,我们打印目标向量的元素,以验证复制的结果。

  1. std::next_permutationstd::next_permutation 用于生成给定范围内元素的下一个排列。它位于 <algorithm> 头文件中。

函数原型如下:

template<class BidirIt>
bool next_permutation(BidirIt first, BidirIt last);

firstlast 是双向迭代器,指定了要生成排列的范围。

以下是一个使用 std::next_permutation 的示例:

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

int main() {
    std::vector<int> nums = {1, 2, 3};

    do {
        for (int num : nums) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    } while (std::next_permutation(nums.begin(), nums.end()));

    return 0;
}

在上面的示例中,我们有一个初始的整数向量 nums,包含了一些整数。然后,我们使用 std::next_permutation 函数生成了 nums 中所有元素的排列,并在每次生成一个排列后打印它们。std::next_permutation 会按字典序生成下一个排列,直到所有的排列都被生成完毕。

std::next_permutation 一起使用的函数对象或谓词。这样的函数对象或谓词可以用于自定义生成排列的规则或条件。

以下是一个示例,展示了如何使用自定义的比较函数对象来生成排列:

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

struct Compare {
    bool operator()(int a, int b) {
        // 自定义比较函数,按照降序排列
        return a > b;
    }
};

int main() {
    std::vector<int> nums = {3, 1, 2};

    // 使用自定义的比较函数对象生成降序排列
    std::sort(nums.begin(), nums.end(), Compare());

    do {
        for (int num : nums) {
            std::cout << num << " ";
        }
        std::cout << std::endl;
    } while (std::next_permutation(nums.begin(), nums.end()));

    return 0;
}

在上述示例中,我们定义了一个名为 Compare 的函数对象结构体,它重载了圆括号操作符,用于自定义比较规则。我们使用 std::sort 函数和自定义的比较函数对象将向量 nums 进行降序排序。

然后,我们使用 std::next_permutation 函数生成降序排列的所有排列。std::next_permutation 函数会依次生成下一个排列,直到所有排列都被生成完毕。

 

标签:std,函数,自定义,int,c++,accumulate,include,day
From: https://www.cnblogs.com/jszs0013/p/17537967.html

相关文章

  • c++模板相关学习--泛型编程
     类模板基础#define_CRT_SECURE_NO_WARNINGS#include<iostream>usingnamespacestd;#include<string>template<classNAMETYPE,classAGETYPE=int>//类模板中可以有默认参数classPerson{public:Person(NAMETYPEname,AGETYPEage){......
  • C++ 惯用法之 Copy-Swap 拷贝交换
    C++惯用法之Copy-Swap拷贝交换这是“C++惯用法”合集的第3篇,前面2篇分别介绍了RAII和PIMPL两种惯用法:RAII:ResouceAcquistionIsInitializationPIMPL:PointerToImplemetation正式介绍Copy-Swap之前,先看下《剑指Offer》里的第☝️题:如下为类型CMyString......
  • 2.【初级班】VS环境创建一个简单的程序(C,C++)
    本课知识点C,C++第一个程序生成程序输出窗口生成程序所在目录新建->项目Ctrl+Shift+N C:\Users\Administrator\Source\Repos\L001\Debug\include<stdio.h>voidmain(){printf("我的第一个程序helloworld!");getchar();}voidmain()//001-识记入口函数名main......
  • 音标编码 转unicode输出,VC++
    字典的音标有的是用 KingsoftPhoneticPlain字体,有的是用KK字体,对应的编码也不同,输出时可以设置对应的字体,但是需要安装对应的字体,程序中还要改字体。统一改成UTF16后就可以统一输出了,window程序一般都用UTF16,接口转换也比较方便。对应的转换关系可以在网上找,不过网上的不......
  • C++之在线程间切分任务
    背景在多线程编程中,如何有效地在多个线程间切分任务是一个关键问题。合理地切分任务可以充分发挥多核处理器的性能,提高程序的运行效率。本文将介绍在线程间切分任务的原理和实践,包括任务切分策略、负载均衡、任务同步等方面的内容。任务切分策略在多线程编程中,我们需要根据实际......
  • C++之原子操作:实现高效、安全的多线程编程
    背景在多线程编程中,线程间的同步和数据竞争问题是无法避免的。传统的同步方法,如互斥锁(mutex)和条件变量(conditionvariable),可能导致性能下降和死锁等问题。C++11引入了原子操作,提供了一种更高效、安全的多线程编程方式。本文将介绍C++中的原子操作概念、使用方法及示例。C++中的......
  • C++之深入探讨同步操作与强制次序
    背景在C++多线程编程中,线程间的同步与顺序执行是至关重要的。同步操作可以确保线程间的数据一致性,避免数据竞争和死锁问题。强制次序则可以确保线程间的操作按照预期顺序执行。本文将详细介绍C++多线程编程中的同步关系、先行关系、原子操作的内存顺序、释放序列和同步关系、栅栏......
  • C++之内存模型
    背景C++内存模型是C++程序中内存管理和数据存储的基础。了解C++内存模型的概念和运作机制对于编写高效、安全的C++代码至关重要。本文将详细介绍C++内存模型的基本概念、内存分配策略以及与其相关的代码示例。C++内存模型的基本概念C++内存模型主要包括以下几个部分:静态存储......
  • C++之锁
    背景在C++多线程编程中,锁是一种常用的同步原语,用于保护共享数据的访问。C++标准库提供了多种锁类型,适用于不同的使用场景。在这篇博客中,我们将介绍C++中的各种锁类型,比较它们的特点,并探讨不同锁在实际应用中的使用场景。std::mutexstd::mutex是C++标准库中最基本的互斥锁类型,它......
  • C++之future
    背景在C++多线程编程中,同步线程间的操作和结果通常是一个关键问题。C++11引入了std::future这一同步原语,用于表示异步操作的结果。本文将介绍C++中std::future的使用方法、优势以及与其他同步方法的对比。使用std::futurestd::future表示一个异步操作的结果,可以用于获取操作的......