程序设计入门笔记 常用算法与STL总结 C++

算法设计分析

1. STL容器

1.1 vector可变数组

创建

语法:

vector<元素类型> 数组名(长度,初始值 = 0)   普通初始化可变数组
vector<元素类型> 数组名(地址起点,地址终点)  将指定地址的元素的值赋值给可变数组
/* 示例 */
vector<int> list; // 定义不定长list列表,元素类型为int
vector<int> list(3,0); // 定义初始长度为3,元素默认值为0的int类型可变数组

int b[7]={1,2,3,4,5,6,7};
vector<int> a(b,b+7);
属性
/* 【查看】 */
// size() 返回元素个数
a.size( )

// a.resize( )改变可变数组大小 多则删,少则补,其值随机
//[C++]系统为某一程序分配空间的所需时间,与空间大小无关,与申请次数有关如申请一个空间为1000 和 空间为1 申请1000次的所需时间差别是很大的,申请次数越多,越耗时间 
a.resize( num )

// empty() 判断a是否为空,空则返回true,非空则返回false
a.empty();

// front()和 back() 返回首/尾的元素
a.front();
a.back(); 


/* 【增删改】 */
// insert()
a.insert(a.begin()+2,10)  //插入10到索引为2的位置

// clear() 清空a中的元素
a.clear();

// pop_back() 删除最后一个元素
a.pop_back();

// push_back() 将元素插入到最后
a.push_back(5);

// erase() 删除指定元素
a.erase(p) //从a中删除迭代器p指定的元素,p必须指向c中的一个真实元素,不能是最后一个元素end()
a.erase(b,e)//从a中删除迭代器对b和e所表示的范围(位置信息)中的元素,返回e
a.erase(a.begin(),a.begin()+2)  // 删除前三个元素

常用函数

reverse() 翻转指定区域

vector<int> a={1,2,3,4,5};
reverse(a.begin(),a.end());
cout<<a;

54321


1.2 pair配对

创建

语法:

pair<first的数据类型,second的数据类型>元素名{对应值};
pair<first的数据类型,second的数据类型>元素名;
元素名.first=xxx;
元素名.second=xx;
/*示例*/
pair<string,float> score {"Chinese",100};

pair<string,string> pair_test;
pair_test.first="test";
pair_test.second="final";
属性
//pair.first()/sceond() 返回first/second元素值
pair<string,float> score {"Chinese",100};
cout<<score.first;

Chinese

常用函数

1.3 string字符串

创建
string 元素名 ="内容"
属性

1. substr(startPos,lenth)

功能: 主要功能是复制子字符串,要求从指定位置startPos开始,并具有指定的长度lenth。如果没有指定长度或超出了源字符串的长度,则子字符串将延续到源字符串的结尾。

int main() {
    string test="Hello World,Hello C++";
    string t1 = test.substr(0,5);
    string t2 = test.substr(5); //未指定长度 则子串延续到末尾
    cout<<t1<<endl<<t2;
}

Hello
World,Hello C++

2. push_back() 和 insert()

功能: 向字符串指定位置插入元素

int main() {
    string test="Hello World,Hello C++";
    test.push_back('!'); //push_back只能在尾部插入元素 且 只能插入一个元素
    cout<<test<<endl;
    test.insert(test.begin(),'!'); // insert插入单元素 需要制定插入位置
    cout<<test<<endl;
    test.insert(0,"This is a Test Sentence",0,10);
    // 等价于 test.insert(pos1= 0 ,"This is a Test Sentence",pos2= 0,n =10); 
    // 使用insert插入字符串时只能插入字符串的子串,且需要通过指定目标字符串的索引,源字符串的索引,以及子串的长度
    cout<<test<<endl;
}

Hello World,Hello C++!
!Hello World,Hello C++!
This is a !Hello World,Hello C++!

3. empty()

功能: 查看字符串是否为空

int main(){
    string test ="None";
    cout<<test.empty();
}

0

4. size() 或 lenth()

功能:unsignedint的形式返回字符串的长度

注意: 由于返回的是unsignedint,若出现需要对返回值进行减法操作时,一定要将其转化为int,否则会导致数据异常

int main(){
    string test ="None";
    cout<<test.size()<<endl;
}

4

5. clear()

功能: 清空字符串

int main(){
    string test="None";
    test.clear();
    cout<<test<<endl;
    cout<<test.empty();
}

(此行为空)

1

常用函数

1.4 queue队列

创建

属性

常用函数


1.5 deque双向队列

创建

属性

常用函数


1.6 stack栈

创建

语法: stack<类型> 名字;

stack<int> s;
属性
s.size() ; //返回这个栈的长度 
s.push() ; //向栈顶插入一个元素 
s.pop()  ; //弹出栈顶元素
s.top()  ; //返回栈顶元素 
s.empty(); //返回栈空状态
/*示例*/
int main(){
    stack <int> s;
    s.push(1);
    s.push(2);
    cout<< s.top()<<endl;
    s.pop();
    s.pop();
    cout<<"s的状态是"<<s.empty();
    return 0;
}

2

s的状态是1

常用函数


1.7 set集合

创建

属性

常用函数


1.8 map映射

创建

属性

常用函数


1.9 unordered

创建

属性

常用函数


1.10 bitset压位

创建

属性

常用函数

1.11 链表(非STL)

创建
struct ListNode {
    int val;        // 节点值
    ListNode *next; // 后继节点引用
    ListNode(int x) : val(x), next(NULL) {} // 创建对象函数
};

// 实例化节点
ListNode *n1 = new ListNode(4); // 节点 head
ListNode *n2 = new ListNode(5);
ListNode *n3 = new ListNode(1);

// 构建引用指向
n1->next = n2;
n2->next = n3;


2. 算法常用函数

2.1 sort函数

sort

功能: 进行快速排序,但该方法具有不稳定性,可能导致相等元素的原始顺序可能会在排序后被改变。

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

// comppare cmp函数的返回值表示的是是否应该让a值出现在b前
bool compare(int a, int b) {
    return a > b; 
}

int main() {
    std::vector<int> nums = {5, 2, 9, 1, 5};
    std::sort(nums.begin(), nums.end(), compare);
    for (int num : nums) {
        std::cout << num << " ";
    }
    std::cout << std::endl;
    return 0;
}

9 5 5 2 1

stable_sort

功能: 进行具有稳定性的快速排序,代价是增大空间复杂度。

#include <vector>
#include <algorithm>

int main() {
    std::vector<int> v = {5, 2, 9, 1, 5};
    std::stable_sort(v.begin(), v.end());
    for(int i : v) {
        std::cout << i << ' ';
    }
    return 0;
}

1 2 5 5 9

partial_sort

语法:

void partial_sort(ForwardIt first, ForwardIt middle, ForwardIt last, Compare cmp);
//ForwardIt 是输入迭代器类型,Compare 是比较函数或函数对象,first, middle, last 是定义范围的迭代器。

功能: 将 first 和 last 范围内的元素排序,使得 first 到 middle 范围内的元素都比 middle 指向的元素小,middle 到 last 范围内的元素都比 middle 指向的元素大。注意,middle 指向的元素可能不在最终排序的位置。

#include <vector>
#include <algorithm>
#include <functional>

bool compare(int a, int b) {
    return a > b;
}

int main() {
    std::vector<int> v = { 4, 2, 9, 1, 5 };
    std::partial_sort(v.begin(), v.begin() + 3, v.end(), compare);
    for (int i : v) {
        std::cout << i << ' ';
    }
    return 0;
}

9 5 4 1 2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NUDTer2026

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值