c++ stl初步(一):pair,vector
以下所有笔记皆是我自己一个个上课手打的
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;
}
更多推荐
所有评论(0)