算法设计分析
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