请给出实际可运行的例子
问题描述如下:
map怎么样通过key和value之间的关系输出本人想要的特定关系。
形式如:
typedef map<string,string> set_map;
set_map set_str;
set_str[“a”]=”str1″;
set_str[“p”]=”a”;
set_str[“e”]=”p”;
set_str[“t”]=”e”;
set_str[“b”]=”str2″;
set_str[“q”]=”b”;
set_str[“c”]=”str3″;
set_str[“i”]=”c”;
set_str[“j”]=”i”;
既map中装的原始数据为:
a=str1
p=a
e=p
t=e
问题描述如下:
map怎么样通过key和value之间的关系输出本人想要的特定关系。
形式如:
typedef map<string,string> set_map;
set_map set_str;
set_str[“a”]=”str1″;
set_str[“p”]=”a”;
set_str[“e”]=”p”;
set_str[“t”]=”e”;
set_str[“b”]=”str2″;
set_str[“q”]=”b”;
set_str[“c”]=”str3″;
set_str[“i”]=”c”;
set_str[“j”]=”i”;
既map中装的原始数据为:
a=str1
p=a
e=p
t=e
b=str2
q=b
c=str3
i=c
j=i
输出为:
t=str1
q=str2
j=str3
解决方案
10
对于 map 中任意键值对 p1(k1, v1) ,寻找 p2(v1, v2)
-若未找到,另取一键值对
-若找到,修改 p1 为 (k1, v2) ,并从 map 中删除 p2
重复以上步骤到 map 不再变动
-若未找到,另取一键值对
-若找到,修改 p1 为 (k1, v2) ,并从 map 中删除 p2
重复以上步骤到 map 不再变动
template <typename T> bool SolveMapSingle(map<T, T>& edges, typename map<T, T>::key_type const& k) { bool solved = false; typename map<T, T>::iterator i; while ((edges.find(k) != edges.end()) && (i = edges.find(edges[k])) != edges.end()) { edges[k] = i->second; edges.erase(i); solved = true; } return solved; } template <typename T> void SolveMap(map<T, T>& edges) { if (edges.size() > 1) { size_t i = 0; do { while (SolveMapSingle(edges, next(edges.begin(), i)->first)) { i = 0; } } while (++i != edges.size()); } for (auto&& p : edges) { cout << p.first << " = " << p.second << endl; } }
10
#include <iostream>
#include <string>
#include <map>
#include <set>
#include <list>
using namespace std;
typedef set<string> str_key;
typedef map<string, string> set_map;
set_map set_str;
set_map map_set_value()
{
//set_str str;
set_str[“a”] = “str1”;
set_str[“p”] = “a”;
set_str[“e”] = “p”;
set_str[“t”] = “e”;
//输出为:e=str1
set_str[“b”] = “str2”;
set_str[“q”] = “b”;
//输出为:b=str2
set_str[“c”] = “str3”;
set_str[“i”] = “c”;
set_str[“j”] = “i”;
//输出为:j=str3
return set_str;
}
bool Deal(set_map& value)
{
for(set_map::iterator iter = value.begin();iter != value.end(); iter++)
{
if (value.find(iter->second) != value.end())
{
string temp = iter->second;
value[iter->first] = value[iter->second];
value.erase(temp);
if (Deal(value))
return true;
return false;
}
}
return true;
}
int main()
{
set_map sm = map_set_value();
Deal(sm);
for (set_map::iterator iter = sm.begin(); iter != sm.end(); iter++)
{
cout << “key:” << iter->first << ” value:” << iter->second << endl;
}
system(“pause”);
return 0;
}
用了个简单的递归
#include <string>
#include <map>
#include <set>
#include <list>
using namespace std;
typedef set<string> str_key;
typedef map<string, string> set_map;
set_map set_str;
set_map map_set_value()
{
//set_str str;
set_str[“a”] = “str1”;
set_str[“p”] = “a”;
set_str[“e”] = “p”;
set_str[“t”] = “e”;
//输出为:e=str1
set_str[“b”] = “str2”;
set_str[“q”] = “b”;
//输出为:b=str2
set_str[“c”] = “str3”;
set_str[“i”] = “c”;
set_str[“j”] = “i”;
//输出为:j=str3
return set_str;
}
bool Deal(set_map& value)
{
for(set_map::iterator iter = value.begin();iter != value.end(); iter++)
{
if (value.find(iter->second) != value.end())
{
string temp = iter->second;
value[iter->first] = value[iter->second];
value.erase(temp);
if (Deal(value))
return true;
return false;
}
}
return true;
}
int main()
{
set_map sm = map_set_value();
Deal(sm);
for (set_map::iterator iter = sm.begin(); iter != sm.end(); iter++)
{
cout << “key:” << iter->first << ” value:” << iter->second << endl;
}
system(“pause”);
return 0;
}
用了个简单的递归