以下所有笔记皆是我自己一个个上课手打的

1.pair

在c++中,pair是一个模板类,用于表示一对值的组合。它位于<utility>头文件中

其定义如下:

template<class T1, class T2>
struct pair
{
	T1 first;//第一个值
	T2 second;//第二个值
	//构造函数
	pair();
	pair(const T1& x, const T2& y);
	//比较运算符重载
	bool operator==const pair& rhs) const;
	bool operator!=const pair& rhs) const;
	//其他成员函数和特性
};

T1和T2分别表示第一个值和第二个值的类型
pair类有两个成员变量,first second,分别表示第一个值第二个值
pair类还有一些成员函数和特性,例如默认构造函数,带参数的构造函数,比较运算符重载等
pair可以方便地将两个值组合在一起,并进行传递,存储和操作
例如,可以将两个整数组合在一起作为函数的返回值,或者将一对值存储在容器中

int main()
{
	pair<int, double>p1(1, 3.14);
	pair<char, string>p2('a', "hello");
	cout << p1.first << ", " << p1.second << endl;
	cout << p2.first << ", " << p2.second << endl;
	return 0;
}

pair的嵌套

int main()
{
	pair<int, int>p1(1, 2);
	pair<int, pair<int, int>>p2(3, make_pair(4, 5));
	pair<pair<int, int>, pair<int, int>>p3(make_pair(6, 7), make_pair(3, 4));
	cout << p1.first << ", " << p1.second << endl;
	cout << p2.first << ", " << p2.second.first << ", " << p2.second.second << endl;
	cout << p3.first.first<< ", " << p3.first.second << ", " << p3.second.first << endl;
	return 0;
}

pair自带排序规则:
 是按照first的成员进行升序排序
 如果first成员相等,则按照second成员进行升序排序
 这意味着当你使用标准库中的排序算法(如 std::sort)对包含pair的对象的容器进行排序时,会根据pair的对象的first成员进行排序

int main()
{
	vector<pair<int, int>>vec;
	vec.push_back(make_pair(3, 2));
	vec.push_back(make_pair(1, 4));
	vec.push_back(make_pair(2, 1));
	sort(vec.begin(), vec.end());
	for (const auto& p : vec)
	{
		cout << p.first << ", " << p.second << endl;
	}
	return 0;
}//从上到下依次输出1,4 2,1 3,2

其他代码示例:

​
// 代码示例
struct Person
{
	string name;
	int age;
};
int main()
{
	//创建一个存储Person对象的向量
	vector<Person>people;
	// 选则一些Person
	people.push_back({ "alice",25 });
	people.push_back({ "bob",22 });
	people.push_back({ "faker",19 });
	//创建一个存储pair的向量,每个pair包含一个Person对象和一个评分
	vector<pair<Person, int>>scores;
	//添加一些pair到向量中
	scores.push_back({ people[0],90 });
	scores.push_back({ people[1],85 });
	scores.push_back({ people[2],95 });
	//遍历pair向量,并输出每个人的姓名,年龄和评分
	for (const auto& pair : scores)
	{
		cout << "name:" << pair.first.name << endl;
		cout << "age:" << pair.first.age << endl;
		cout << "score:" << pair.second << endl;
		cout << endl;
	}
	return 0;
}

​

2.vector

 老朋友了,头<vector> 声明:vector<t>vec  t:元素类型
 可以存储一系列相同类型的元素,是一个动态数组
 元素范围:0~~~size()-1 可以使用[]或者at()运算符来访问元素
 push_back:在末尾添加元素
 pop_back:在末尾删元素
 insert():在指定位置插入元素
 erase():删除指定位置的元素
 size():获取整个vector中元素的数量
 empty():检查数组是否为空
 resize();调整vector的大小
 迭代器:begin(),end()
 vector去重:使用unique()函数,头:<algorithm>
 首先,对vector中的元素进行排序,然后unique将重复的元素移到vector的末尾,并返回一个指向重复元素的
 迭代器,最后,可以使用vec.erase函数将重复元素从vector中删除
 示例:

int main()
{
	vector<int>vec = { 2,1,3,2,4,1,5,4 };
	sort(vec.begin(), vec.end());
	auto last = unique(vec.begin(), vec.end());
	vec.erase(last, vec.end());
	for (const auto& num : vec)
	{
		cout << num << " ";
	}
	return 0;
}

/*解释:unique函数:
该函数会将相邻的重复元素移动到向量末尾,并返回一个指向新的逻辑末尾的迭代器last。
注意:unique并不会改变向量的物理大小,只是将不重复的元素排列在前部,重复元素被移动到后部。
执行后,向量内容变为{ 1,2,3,4,5, ? , ? , ? },其中 ? 表示被移动的重复元素(值可能为原向量中的任意值),last指向第一个 ? 的位置。
erase函数:
移除从last到向量末尾的所有元素,从而物理上删除重复元素。
最终向量的大小变为 5,内容为{ 1,2,3,4,5 }。*/

删除单个元素:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {10, 20, 30, 40, 50};
    
    // 删除第3个元素(索引2)
    vec.erase(vec.begin() + 2);
    
    // 输出结果:10 20 40 50
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}

删除多个元素:

#include <vector>
#include <iostream>

int main() {
    std::vector<int> vec = {1, 2, 2, 3, 2};
    
    for (auto it = vec.begin(); it != vec.end();) {
        if (*it == 2) {
            it = vec.erase(it); // erase返回下一个有效迭代器
        } else {
            ++it; // 未删除时,正常递增迭代器
        }
    }
    
    // 输出结果:1 3
    for (int num : vec) {
        std::cout << num << " ";
    }
    return 0;
}

示例代码:

int main()
{
	vector<int>numbers;
	numbers.push_back(5);
	numbers.push_back(2);
	numbers.push_back(8);
	numbers.push_back(5);
	numbers.push_back(1);
	numbers.push_back(2);
	numbers.push_back(9);
	numbers.push_back(8);
	//打印向量中的元素
	cout << "原始向量的元素: ";
	for (const auto& number : numbers)
	{
		cout << number << " ";
	}
	cout << endl;
	//对向量进行排序
	sort(numbers.begin(), numbers.end());
	//打印排序后的向量
	cout << "排序后:";
	for (const auto& number : numbers)
	{
		cout << number << " ";
	}
	cout << endl;
	//去除重复元素
	numbers.erase(unique(numbers.begin(), numbers.end()), numbers.end());
	//这里unique部分返回了了一个迭代器(类似last),表示消除last到end的数字
	// 打印去重后的向量
	cout << "去重后:";
	for (const auto& number : numbers)
	{
		cout << number << " ";
	}
	cout << endl;
	// 向向量中插入元素
	numbers.insert(numbers.begin() + 2, 3);
	//打印插入后
	cout << "插入后:";
	for (const auto& number : numbers)
	{
		cout << number << " ";
	}
	cout << endl;
	// 删除向量中的某个元素
	numbers.erase(numbers.begin() + 4);
	// 打印
	cout << "删除后:";
	for (const auto& number : numbers)
	{
		cout << number << " ";
	}
	cout << endl;
	//检查
	if (numbers.empty())
	{
		cout << "向量为空" << endl;
	}
	else
	{
		cout << "向量不为空" << endl;
	}
	// 获取向量的大小
	cout << "向量的大小:" << numbers.size() << endl;
	//清空向量
	numbers.clear();
	//检查向量是否为空
	if (numbers.empty())
	{
		cout << "向量为空" << endl;
	}
	else
	{
		cout << "向量不为空" << endl;
	}
	return 0;
}

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐