C++STL的学习

int a{2};//初始化 vector<int>a; |

![]() | |||
#注意空格也是一个字符 | |||
#include <iostream> #include <string>
void replaceSubstring(std::string& str, const std::string& s, const std::string& t) { size_t startPos = 0; // 初始化起始搜索位置为0 //find(从str中要找的元素,从字符串哪个位置开始) //当find没有找到目标字符返回npos while ((startPos = str.find(s, startPos)) != std::string::npos) { // 调用 string 类的成员函数 replace 进行替换 // 将从 startPos 开始的子串 s 替换为 t //string& replace(pos, n, t) 替换从pos位置开始的需要替换n个字符为t str.replace(startPos, s.length(), t); startPos += t.length(); // 移动起始搜索位置到替换后的位置 } }
int main() { std::string str ="ababcd"; // 原始字符串 std::string s{"ab"}; // 要被替换的子串 std::string t = "123"; // 用来替换的新串
// 调用替换函数,替换原始字符串中的子串 replaceSubstring(str, s, t);
// 输出替换后的字符串 std::cout << "替换后的字符串为:" << str << std::endl;
return 0; } |
#include<iostream> #include<algorithm>//包含sort的头文件 using namespace std;
struct student { std::string name; int score; };
bool com(student& a, student& b)//定义函数从大到小排序 { return a.score > b.score; }
int main() { student stu[5] = { {"Alice", 85},{"Bob", 92},{"Charlie", 78},{"David", 92},{"Eve", 85} }; std::sort(stu, stu + 5, com); //sort(开始位置,结束位置,排序方法) std::cout << "输出"<<std::endl; for (int i = 0; i < 5; i++) { std::cout << stu[i].name<<" " << stu[i].score << std::endl; } } |
#include<iostream> #include<vector> #include<set> using namespace std; int setfind(vector<int>& v, int k) { set<int> s; //set<int,greater<int>>s; 会使s中元素从大到小排序 for (int e : v)//遍历容器 v 中的每个元素,将每个元素依次赋值给 e s.insert(e);//set容器中s使用insert后会自动去重复元素并排序 auto it = s.begin(); //it:标识符 //迭代器:遍历用的 for (int i = 1; i < k; i++) it++; return *it;
}
int main() { vector<int> v= { 1, 1, 2, 2, 3, 3, 4, 4, 6 }; int k; cin >> k; int t=setfind(v, k); cout << t; } |
练习
//统计各元素出现次数
#include<iostream>
#include<map>
#include<vector>
using namespace std;
vector<int> mapfind(vector<int>& v, int k)
{
vector<int> ans;
map<int,int,greater<int>> mp;
for (auto e : v)
mp[e]++;
auto it = mp.begin();
for (int i = 0; i < k && it != mp.end(); i++)
{
ans.push_back(it->first);//ans[1]:2, ans[2]:1, ans[3]:2
//it->first 表示迭代器 it 指向的键值对中的键
ans.push_back(it->second);
//it->second键值对中的值
it++;
}
return ans;
}
int main()
{
vector<int> v = { 1,1,2,3,3 };
vector<int>ans;
ans=mapfind(v, 3);
for (auto it = ans.begin(); it!=ans.end(); it++)
{
cout << *it<<" ";
}
}
算法
迭代法
思想:旧值推新值,新值赋旧值
子集(LeetCode78)
给定一个整数数组 nums,长度范围是1~10,其中所有元素互不相同。求该数组所有可能的子集(幂集),结果中不能包含重复的子集,可以按任意顺序返回幂集。
例如, nums=[1,2,3],结果为[[],[1],[2],[1,2],[3],[1,3],[2,3],[1,2,3]]。
//幂集
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>>append(vector<vector<int>>M1, int x)
{
vector<vector<int>>A = M1;
for (int j = 0; j < A.size(); j++)
{
A[j].push_back(x);
}
return A;
}
vector<vector<int>> mj(int n)
{
vector<vector<int>>M;//存放所有幂集
vector<vector<int>>M1 = { {},{1} };//设M1为1的幂集
if (n == 1)return M1;
for (int i = 2; i <= n; i++)
{
vector<vector<int>>A = append(M1, i);
M = M1;
for (int j = 0; j < A.size(); j++)
{
M.push_back(A[j]);
}
M1= M;
}
return M;
}
int main()
{
vector<vector<int>>nums;
int n = 3;
nums=mj(n);
for (auto it : nums)
{
for (auto num : it)
{
cout << num << " ";
}
cout << endl;
}
}
分治算法
思想:先分两个,然后通过两个递归合起来
对于给定的含有n个整数的无序序列,求这个序列中最大和次大的两个不同的元素。
#include<iostream>
#include<vector>
using namespace std;
// [5,3,4,8,1,7] // 初始数组
// / \
// [5,3,4] [8,1,7] // 第一次分割
// / \ / \
// [5,3] [4] [8,1] [7] // 第二次分割
// / \ (max=min) / \
// [5] [3] [8] [1] // 第三次分割
//(max)(min) ...
void findmax(vector<int>& num, int start,int end,int &max,int &min)
{
if (start == end)
{
max = num[start];
min = num[start];
return;
}
if (start + 1 == end)
{
if (num[start] > num[end]) {
max = num[start];
min= num[end];
}
else {
max = num[end];
min= num[start];
}
return;
}
int mid = (start + end) / 2;
int lmax, lmin;
int rmax,rmin;
findmax(num, start, mid, lmax, lmin);
findmax(num, mid+1, end, rmax, rmin);
max = std::max(lmax, rmax);
min = std::max(std::min(lmax, rmax), std::max(lmin, rmin));
}
int main()
{
vector<int>num = { 5,3,4,8,1,7 };
int n = num.size();
int max, min;
findmax(num, 0, n - 1, max, min);
cout << "最大" << max;
cout << "次大" << min;
}
回溯法
给定n个不同的正整数集合a=(ao,a1,..,an-1)和一个正
整数t,要求找出a的子集s,使该子集中所有元素的和为t。
例如,当n=4时,a=(3,1,5,2),t8,则满足要求的子
集s为(3,5)和(1,5,2)
#include<iostream>
#include<vector>
using namespace std;
//cs:左边 已相加的和 rs:右边 剩余的未相加的
void play(vector<int>&x,vector<int>a) {
for (int i= 0; i < x.size(); i++) {
if(x[i] == 1)
{
cout << a[i]<<" ";
}
}
cout << endl;
}
void DFS(int cs, int rs, vector<int>&x, int i,vector<int>a) {
if (i >=4)
{
if (cs == 8)
play(x,a);
}
else {
rs -= a[i];
if(cs+a[i]<=8)
{
x[i] = 1;
DFS(cs+a[i], rs, x, i + 1,a);
}
if (cs + rs >= 8) {
x[i] = 0;
DFS(cs, rs, x, i + 1, a);
}
rs += a[i];
}
}
int main() {
vector<int>a = { 3,1,5,2 };
vector<int>x = { 0,0,0,0 };
DFS(0, 11, x, 0, a);
}
贪心法
(LeetCode45)
给定一个含n(1<n<1000)个非负整数
数组nums(0<numslil<1000),数组中的每个元素表示在该位置可
以跳跃的最大长度,假设总是可以从初始位置0到达最后一个位置n-1,
设计一个算法求最少的跳跃次数。
例如nums={2,3,1,1,4},n=5,从位置0可以跳1步到达位置1,
再从位置1跳3步到达位置4,所以结果为2。
#include<iostream>
#include<vector>
using namespace std;
int jump(vector<int>&num)
{
int n = num.size();
int maxp = 0;//最远距离
int step = 0;//跳了多少步
int end = 0;//最远
for (int i = 0; i < n - 1; i++) {//num[i]+i
maxp = max(maxp, num[i] + i);//取范围内跳的最远的
if (end == i) {//当跳到边界处
end = maxp;
step++;
}
}
return step;
}
int main()
{
vector<int>num = { 2,3,1,1,4 };
cout<<"跳" << jump(num)<<"次";
}