更详细、全面的教程请看鞠老师的讨论

建议将代码拷贝进自己的编译器里,然后运行

(注意必须是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处理的向量未排序的结果

image

ChatGPT给出的解释

image