关于pair容器的用法

/*
#include<vector> 	头文件
vector<int> vec; 	创建vector对象
vec.push_back(); 	在数组的最后添加一个数据 	
vec.pop_back();  	去掉数组的最后一个数据
c.clear();         	移除容器中所有数据。
c.empty();         	判断容器是否为空。
c.erase(pos);     	删除pos位置的数据 			c.erase(beg,end) 	删除[beg,end)区间的数据
c.front();         	传回第一个数据。
c.insert(pos,elem);	在pos位置插入一个elem拷贝
c.push_back(elem); 	在尾部加入一个数据。
c.resize(num);     	重新设置该容器的大小为num 
c.size();         	返回容器中实际数据的个数。
*/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
struct Node {
	string name;
	int age;
};


int main()
{
	vector<int > vec;
	for(int i = 0;i < 10;i ++)
		vec.push_back(i + 1);	//将i+1按顺序存入vec容器中 
	cout << "Numbers in the vector:" << endl;
	for(int i = 0;i < vec.size();i ++)	//.size()容器的大小 
		cout << "vec[" << i << "]=" << vec[i] << endl;	//取出vec容器中的第i个元素(从0开始)
	if(!vec.empty())
		cout << "vec容器不为空" << endl;
	
	vector<string> sv;	//定义string类型的容器 
	sv.push_back("郭靖"); sv.push_back("杨过"); sv.push_back("张无忌");
	sv.pop_back();	//去掉数组的最后一个数据
	cout << "\nsv:";
	for(int i = 0;i < sv.size();i ++){
		cout << sv[i] << ' ';
	}
	
	vector<string> sv2;
	sv2.swap(sv);  //交换赋值 
	sv2[0] = "Xu-zhu";       //替换第一个字符串
	cout << "\nsv2:";
	for(int i = 0;i < sv2.size();i ++)
		cout << sv2[i] << " ";
	cout << endl << endl;
	
	vector<Node > nd[2];	//定义2个Node类型的容器 
	Node n;
	n.name = "Hello ";
	n.age  = 20;
	nd[0].push_back(n);
	n.name = "World!";
	n.age  = 16;
	nd[1].push_back(n);
	cout << nd[0][0].age  << nd[1][0].age  << endl;
	cout << nd[0][0].name << nd[1][0].name << endl;
	return 0;
}

<think>好的,用户现在想在不使用C++的pair容器的情况下实现某些功能,特别是之前提到的区间覆盖长度计算的例题。用户提供的代码中使用了vector<PII>来存储原始区间,其中PII是pair<int, int>的别名。用户可能希望了解如何替换掉pair,同时保持代码的功能不变。 首先,我需要回顾一下原代码中pair的作用。在代码中,pair用于存储每个区间的左右端点,即每个区间作为一个pair<int, int>存在segs向量中。因此,找到替代方案的关键在于如何不使用pair来存储这两个整数。 可能的替代方法包括使用结构体、使用两个单独的数组、或者使用其他容器如tuple。用户可能希望选择一种简洁且易于维护的方法。结构体是一个自然的选择,因为它允许自定义数据类型,同时保持代码的可读性。另外,使用两个单独的数组分别存储左端点和右端点也是一种方法,但可能会增加代码的复杂度,尤其是在处理时需要保持两个数组的同步。 接下来,我需要考虑如何修改原代码的具体部分。例如,将vector<PII> segs替换为结构体向量,或者使用两个向量分别存储左和右。同时,在读取输入时,需要调整数据存储的方式。例如,原代码中的segs.push_back({l, r})需要改为结构体的初始化或分别存入两个数组。 另外,在遍历区间时,原代码使用auto seg : segs,然后通过seg.first和seg.second访问左右端点。如果使用结构体,则需要改为seg.l和seg.r;如果使用两个数组,则需要同时访问左数组和右数组的对应索引。 同时,需要注意代码的其他部分是否受到影响,例如差分数组的处理部分,是否仍然可以正确获取左右端点。此外,代码中的find函数和差分数组的操作是否依赖于pair的存在,可能需要调整。 还需要考虑用户可能的其他需求,例如是否希望保持代码的高效性,或者是否有特定的编码风格偏好。例如,使用结构体可能会更清晰,而使用两个数组可能在内存访问上更高效,但可读性较差。 此外,用户可能对C++的其他特性不太熟悉,或者希望避免使用某些高级特性,因此需要选择一种简单易懂的方法。结构体相对于tuple来说,可能更直观,尤其是对于初学者而言。 最后,需要验证替代方案的正确性,确保修改后的代码仍然能够正确计算区间覆盖长度,并且没有引入错误。例如,在结构体的情况下,确保所有访问左右端点的地方都已正确修改,并且在排序或处理时没有遗漏。</think>### 不使用pair容器的替代实现方法 以下是三种常见替代方案,保持原有算法逻辑的同时移除`pair`容器: --- #### 方案一:自定义结构体(推荐) ```cpp #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 10; // 定义区间结构体替代pair struct Segment { int left; int right; }; vector<int> alls; vector<Segment> segs; // 结构体存储区间 int diff[N * 2]; // 二分查找函数保持不变... int find(int x) { /* 同原实现 */ } int main() { int n; cin >> n; // 读取区间数据 for (int i = 0; i < n; i++) { int l, r; cin >> l >> r; segs.push_back({l, r}); // 结构体初始化 alls.push_back(l); alls.push_back(r); } // 后续处理与原代码一致... for (auto seg : segs) { // 访问成员变量 int L = find(seg.left); // left替代first int R = find(seg.right); // right替代second diff[L]++; diff[R + 1]--; } // 剩余代码保持不变... } ``` **优点**:保持代码可读性,明确成员变量含义[^2] --- #### 方案二:双数组并行存储 ```cpp vector<int> lefts, rights; // 替代pair容器 // 数据读取部分改为: for (int i = 0; i < n; i++) { int l, r; cin >> l >> r; lefts.push_back(l); rights.push_back(r); alls.push_back(l); alls.push_back(r); } // 处理区间时: for (int i = 0; i < n; i++) { int L = find(lefts[i]); int R = find(rights[i]); // 后续操作相同... } ``` **适用场景**:需要单独处理左右边界的情况 --- #### 方案三:使用tuple元组 ```cpp #include <tuple> vector<tuple<int, int>> segs; // 使用标准元组 // 数据插入: segs.emplace_back(l, r); // 构造元组 // 数据访问时: for (auto& seg : segs) { int L = find(get<0>(seg)); // 通过序号访问元素 int R = find(get<1>(seg)); } ``` **特点**:标准实现,但可读性低于结构体[^1] --- ### 关键修改点对比 | 原代码使用pair | 结构体方案 | 双数组方案 | tuple方案 | |---------------------|-----------------------|--------------------|---------------------| | `vector<PII> segs` | `vector<Segment> segs`| `lefts/rights`数组 | `vector<tuple<>>` | | `seg.first` | `seg.left` | `lefts[i]` | `get<0>(seg)` | | `seg.second` | `seg.right` | `rights[i]` | `get<1>(seg)` | | 语义清晰度 | ★★★★★ | ★★★☆☆ | ★★★★☆ | --- ### 方案选择建议 1. **需要维护关联数据**:优先选择结构体方案,保持数据完整性 2. **需要频繁单独访问左右边界**:双数组方案更合适 3. **临时简单场景**:tuple方案可以快速实现[^1] 4. **C++17及以上版本**:考虑结构化绑定(Structured Binding)特性 --- ### 扩展思考 若需要处理动态区间合并,结构体方案可通过添加成员函数实现更复杂的操作: ```cpp struct Segment { int l, r; bool overlaps(const Segment& other) const { return !(r < other.l || l > other.r); } }; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值