pair 的用法
std::pair主要的作用是将两个数据组合成一个数据,两个数据可以是同一类型或者不同类型。
C++标准程序库中凡是“必须返回两个值”的函数, 也都会利用pair对象。
class pair可以将两个值视为一个单元。容器类别map和multimap就是使用pairs来管理其健值/实值(key/value)的成对元素。
pair被定义为struct,因此可直接存取pair中的个别值.。
两个pairs互相比较时, 第一个元素正具有较高的优先级.。
make_pair的用法
无需写出型别, 就可以生成一个pair对象
class Solution {
public:
//定义邻接矩阵:key是某个顶点,val是所有 与当前顶点相连的其它顶点 及 两点之间的边组成的pair 的集合
unordered_map<string,vector<pair<string,double>>>mp;
vector<double> calcEquation(vector<vector<string>>& equations, vector<double>& values, vector<vector<string>>& queries) {
//adjmap mp;
int len = equations.size();
for(int i=0;i<len;i++){
//获取与当前顶点a相连的顶点b,并获得a->b的距离
mp[equations[i][0]].push_back(make_pair(equations[i][1],values[i]));
//获取与当前顶点b相连的顶点a,并获得b->a的距离
mp[equations[i][1]].push_back(make_pair(equations[i][0],1/values[i]));
}
vector<double> result(queries.size());
//使用广度优先搜索获取任意两点之间的距离
for(int i=0;i<result.size();i++) result[i] = BFS(queries[i][0],queries[i][1],mp);
return result;
}
private:
double BFS(string& a, string& b, unordered_map<string,vector<pair<string,double>>> &mp){
//筛选条件1:如果这两个顶点中的任意一个都不是邻接矩阵的key,直接return-1;
if(mp.find(a)==mp.end() || mp.find(b)==mp.end()) return -1.0;
//筛选条件2:如果输入的两个顶点是同一个,直接return1.;
if(a==b) return 1.0;
//构建队列,存放着某个 结点 和 该结点与初始结点的累积距离 组成的pair
queue<pair<string,double>> que;
//某个结点是否进入队列的依据:它是否被访问过。bool比int空间少
unordered_map<string,bool> visited(false);
//首先把起始结点push进入队列
que.push(make_pair(a,1.0));
//如果队列不为空
while(!que.empty()){
//获取头部
auto front = que.front();
visited[front.first] = true;
que.pop();
//如果头部元素的first是我们找的结点,那么直接返回second,也就是累积距离
if(front.first==b) return front.second;
//广度优先搜索:如果还没有找到,就把当前结点的邻居push进入队列
for(auto it:mp[front.first]){
//如果这个邻居没有被访问到,那么就把这个邻居 和 从起始结点到这个邻居的累积距离 push进入队列
if(visited[it.first]==false) que.push(make_pair(it.first,front.second*it.second));
}
}
//没有找到
return -1.0;
}
};