更详细、全面的教程请看鞠老师的讨论
建议将代码拷贝进自己的编译器里,然后运行
(注意必须是5.11并且增加了老师的代码,详情请看A003. 常用工具)
从某种程度来讲,算是保姆级的教程?
这里提供的是一些常用的函数(忘了的时候可以看看?
#include <bits/stdc++.h>
using namespace std;
bool judge(int &num){ //在count_if里使用的判断条件
return num > 20;
}
long long sum(long long res, int cur) { // 累加条件
return res + cur * cur;
}
bool cmp(int &a, int &b){ //sort比较器
return a > b;
}
void handle_each(int &num) { // for_each 逐个处理函数
num *= 10;
}
int handle_transform(int &num) { // transform 变形处理函数
return num * 10;
}
int main(){
vector<int> vec = {10, 30, 50, 20, 40, 20, 30, 60}; //定义一个普通的向量
for (auto num : vec) cout << num << ' '; // 这是向量的遍历
/*
for (int i = 0; i < vec.size(); i++) cout << vec[i] << ' ';
这也是一种遍历方法 不过在某些地方不能使用
*/
cout << endl;
cout << "count = " << count(vec.begin(), vec.end(), 20) << endl; //统计20在vec中出现的次数
// count用法:count(起始迭代器,终止迭代器,要查找的元素);
cout << "大于20的数:" << count_if(vec.begin(), vec.end(), judge) << endl; //条件计数(大于20的数
//count_if用法:count_if(起始迭代器,终止迭代器,条件函数);
//条件函数的返回值是bool
cout << "最小元素位置:" << min_element(vec.begin(), vec.end()) - vec.begin() << endl; //最小元素位置
cout << "最小元素值:" << *min_element(vec.begin(), vec.end()) << endl; // 最小元素值
cout << "最大元素位置:" << max_element(vec.begin(), vec.end()) - vec.begin() << endl; //最大元素位置
cout << "最小元素值:" << *max_element(vec.begin(), vec.end()) << endl; // 最大元素值
//min_element(起始迭代器,终止迭代器); max_element(起始迭代器,终止迭代器);
//注意:min_element()和max_element()返回的内容都是迭代器,无法直接输出
swap(vec[1], vec.at(3)); //交换函数,任何数据类型都能使用
cout << "交换后:";
for (auto num : vec) {
cout << num << " ";
}
cout << endl;
cout << "求和:" << accumulate(vec.begin(), vec.end(), 0) << endl;
cout << "条件求和:" << accumulate(vec.begin(), vec.end(), 0, sum) << endl;
//accumulate用法:accumulate(起始迭代器, 结束迭代器,初始值,自定义操作函数);
//自定义操作函数的返回值是数字类型
sort(vec.begin(), vec.end(), cmp); //排序
cout << "排序后:";
for (auto num : vec) {
cout << num << " ";
}
//sort用法:sort(起始位置,终止位置,比较器);
//比较器可不填,默认升序
reverse(vec.begin(), vec.end()); //反转
cout << "反转后:";
for (auto num : vec) {
cout << num << " ";
}
cout << endl;
//reverse用法:reverse(起始迭代器,结束迭代器);
int cnt = unique(vec.begin(), vec.end()) - vec.begin();
// 不会删除重复元素,只会把不重复的元素前移
// 并且必须要是有序的,否则会出现奇怪的效果
cout << "去重后:";
for (auto num : vec) {
cout << num << " ";
}
cout << endl;
cout << "cnt = " << cnt << endl;
cout << "稍加处理后即可输出正确效果:";
for (int i = 0; i < cnt; i++) {
cout << vec.at(i) << " ";
}
cout << endl;
/*
vector<int> nums = {50, 10, 30, 20, 30, 10};
int cnt2 = unique(nums.begin(), nums.end()) - vec.begin();
cout << "未排序而去重后的结果:";
for (auto num : nums) cout << num << " ";
cout << endl;
for (int i = 0; i < cnt2; i++) cout << vec.at(i) << " ";
*/
//unique用法:unique(起始迭代器,结束迭代器);
//返回值是去重之后的尾地址
random_shuffle(vec.begin(), vec.end()); // 随机打乱
cout << "打乱后:";
for (auto num : vec){
cout << num << ' ';
}
cout << endl;
for_each(vec.begin(), vec.end(), handle_each); // 逐个元素处理
cout << "处理后:";
for (auto num : vec) {
cout << num << " ";
}
cout << endl;
//for_each函数用法: for_each(起始迭代器,终止迭代器,处理函数);
//处理函数没有返回值(待确认
vector<int> vec2(vec.size()); //定义一个长度和vec相同的向量
transform(vec.begin(), vec.end(), vec2.begin(), handle_transform);
cout << "变形处理后:";
for (auto num : vec2) {
cout << num << " ";
}
cout << endl;
//transform函数用法: transform(起始迭代器,终止迭代器,处理后的容器,处理函数);
//处理函数可以返回任意值(待确认
//未完待续 ...
return 0;
}
附件
unique处理的向量未排序的结果

ChatGPT给出的解释
