蓝桥杯 第六天 全排列和其他库函数

本文详细介绍了C++标准库中的全排列函数next_permutation()和prev_permutation(),以及内存设置函数memset()、数据交换函数swap()、反转函数reverse()和去重函数unique()的用法和应用场景。
摘要由CSDN通过智能技术生成

目录

1.全排列

1.1.next_permutation()函数

1.2.prev_permutation()函数

2.其他库函数

2.1.memset()

2.2.swap()

2.3.reverse()

2.4.unique()


1.全排列

1.1.next_permutation()函数

next_permutation函数用于生成当前序列的下一个排列.它按照字典对序列进行重新排列,如果存在下一个排序,则将当前序列更改为下一个排列,并返回true;如果当前序列已经是最后一个排序,则将序列更改为第一个排序,并放回false.

vector<int> nums= {1,2,3};

cout << "Initial permutation: ";
for(int num : nums){
    cout << num << ' ';
}
cout << endl;

//生成下一个排列
while (next_permutation(nums.begin() , nums.end())){
    cout << "Next permutation: ";
    for(int num:nums){
        cout << num << ' ';
    }
    cout << endl;
}

1.2.prev_permutation()函数

prev_permutation函数与next_permutation函数相反,它用于生成当前序列的上一个排序.他按照字典对序列进行重新排序,通过存在上一个排序,则将当前序列更改为上一个排序,并返回true;如果当前序列已经是第一个排序,则将序列更改为最后一个排列,并返回false.

vector<int> nums2= {3,2,1};

cout << "Initial permutation: ";
for(int num : nums2){
    cout << num << ' ';
}
cout << endl;

//生成上一个排序
while (prev_permutation(nums2.begin(), nums2.end())) {
    cout << "Previous Permutation: ";
    for(int num:nums2){
        cout << num << ' ';
    }
    cout << endl;
}

2.其他库函数

2.1.memset()

memset()是一个用于设置内存块值的函数.
它的原型定义在<cstring>头文件中,函数的声明如下:

void* memset(void* ptr,int value,size_t num);
//             指针     值        重置

memset()函数接受三个参数:
1.ptr:指向要设置值的内存块的指针.

2.value:要设置的值,通常是一个整数.

3.num:要设置的字节数.

memset()函数将ptr指向的内存块的前num个字节设置为value的值.它返回一个指向ptr的指针.

memset()函数通常用于初始化内存块,将其设置为特定的值.

例如,如果要将一个整数数组的所有原始设置为0,可以使用memset()函数如下:

int arr[10];
memset(arr,0,sizeof(arr));

 在上述示例中,memset(arr,0,sizeof(arr))将数组arr的所有元素设置为0.

需要注意的是,memset()函数对于非字符类型的数组可能会产生未定义行为.

在处理非字符类型的数组时,更好使用c++中的其他方法,如循环遍历来初始化数组.
memset会将每个byte设置为value.

2.2.swap()

swap(T &a,T &b)函数接受两个参数:

1.a:要交换值的第一个变量的引用.

2.b:要交换值的第二个变量的引用.

swap()函数通过将第一个变量的值存储到临时变量中,然后将第二个变量的值赋给第一个变量,最后将临时的值赋给第二个变量,实现两个变量值的交换.

swap()函数可以用于交换任意类型的变量,包括基本类型(如整数,浮点数等)和自定义类型(如结构体,类对象等).

以下是一个示例,展示如何使用swap()函数交换两个整数的值:

int a=10;
int b=20;
std::swap(a,b);

2.3.reverse()

reverse()是一个用于反转容器中元素顺序的函数.

它的原型定义在<algorithm>头文件中,函数的声明如下:

template<class BidirIt>
void reverse(BidirIt first,BidirIt last);

reverse()函数接受两个参数:

1.first:指向容器中要反转的第一个元素的迭代器.

2.last:指向容器中要反转的最后一个元素的下一个位置的迭代器.

reverse()函数将 [first , last) 范围内的元素顺序进行反转.

也就是说,它会将 [first , last) 范围内的元素按相反的顺序重新排序.

reverse() 函数可用于反转各种类型的容器,包括数组,向量,链表等.

以下是一个示例,展示如何使用reverse()函数反转的一个整数向量的元素顺序:

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

int main(){
    std::v

}

 在上述示例中,std::reverse(vec.begin(),vec.end())将整型向量vec中的元素顺序进行反转,最终输出的结果是 5 4 3 2 1.

需要注意的是,reverse()函数只能用于支持双向迭代器的容器,因为它需要能够向前和向后遍历容器中的元素,对于支持单向迭代器的容器(如前向链表),无法使用reverse()函数进行反转.

2.4.unique()

unique()是一个用于去除重复的元素的函数.

它的原型定义在<algorithm>头文件中,函数的声明如下:

template<class ForwardIt>
ForwardIt unique(ForwardIt first, ForwardIT last);

unique(first,last)函数接受两个参数:

1.first:指向容器中要去重的第一个元素的迭代器.

2.last:指向容器中要去重的最后一个元素的下一个位置的迭代器.

unique()函数将 [first , last) 范围内的相邻重复的元素去除,并放回一个指向去重后范围的尾后迭代器,去重的范围中只保留了第一个出现的元素,后续重复的元素被移除.

unique()函数可用于去除各种类型的容器中的相邻重复元素,包括数组,向量链表等

以下是一个示例,展示如何使用unique()函数去除一个整型向量中的相邻重复元素:

int main()
{
    std::vector<int> vec = {1,1,2,2,3,3,3,4,4,5};
    //使用unique()函数 vec变成: 1 2 3 4 5 1 2 3 3 4
    auto it= std::unique(vec.begin(),vec.end()); //返回5下标
    vec.erase(it,vec.end()); //删除下标5之后的数据

    for(int num : vec) {
        std::cout << num << " ";
    }
    std::cout << endl;
    return 0;
}

需要注意的是:unique()函数只能去除相邻的重复元素,如果容器中存在非相邻的重复元素,则无法去除.

如果需要去除所有重复dui元素,而不仅仅是相邻的重复元素,可以先对容器进行排序,然后再使用unique()函数.

unique()时间复杂度为 O(n).

  • 44
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值