2011-06-02 44 views
0

我有一張地圖這樣從地圖獲取細節並將其保存到另一個?

map<string, pair< pair<int, int>, string> > 

什麼是讓只有兩個字符串並保存到另一個地圖這樣

map<string, string> 

最簡單的方法? 我的意思是有另一種方式,而不是像這樣?

map<string, pair< pair<int, int>, string> > info; 
    map<string, pair< pair<int, int>, string> >::iterator i; 
    map<string, string> something; 


    for(i=info.begin(); i!=info.end(); ++i) 
     something[*i).first] = ((*i).second).second; 
+0

另一種方式比的東西,不編譯?是的,可能...呃,爲什麼'.c_str()'? – 2011-06-02 13:07:52

+0

這是絕對的老代碼片段... – 2011-06-02 13:17:31

+0

它仍然不能編譯。 – 2011-06-02 13:20:12

回答

2

首先,我要定義一個適當的類型:

struct Mapped 
{ 
    int someSignificantName; 
    int anotherName; 
    std::string yetAnother; 
}; 

幾乎沒有的情況下std::pair是n可接受的解決方案 (快速入侵和測試除外)。鑑於這種情況,您定義的映射 功能對象:

struct Remap 
    : std::unary_operator<std::pair<std::string, Mapped>, 
          std::pair<std::string, std::string> > 
{ 
    std::pair<std::string, std::string> operator()(
      std::pair<std::string, Mapped> const& in) const 
    { 
     return std::make_pair(in.first, in.second.yetAnother); 
    } 
}; 

,然後使用std::transform

std::transform(in.begin(), in.end(), 
       std::inserter(out, out.end()), 
       Remap()); 
+0

我喜歡你怎麼說「幾乎沒有的情況下'的std :: pair'是一個可接受的解決方案」,然後繼續使用它嚴重:P – 2011-06-02 13:16:56

+0

@Tomalak:埃姆,他不得不因爲'的std ::地圖'。 :P @James:呃,你也需要一個'operator <'。 – Xeo 2011-06-02 13:22:15

+0

@Xeo:我知道,但反語太好了。 – 2011-06-02 13:28:26

1
map<string, pair< pair<int, int>, string> > map1 /* = ... */; 
map<string, string> map2; 

BOOST_FOREACH (const pair<string, pair< pair<int, int>, string> > >& it, map1) { 
    map2[it.first] = it.second.second; 
} 

順便說一句,EWTYPE。

1

最簡單的方法是編寫簡單的循環,只是工作。

typedef pair<pair<int, int>, string> strange_pair_t; 
typedef map<string, strange_pair_t> strange_type_t; 
strange_type_t src_map; 

map<string, string> dst_map; 
for(strange_type_t::const_iterator it = src_map.begin(); it!=src_map.end(); ++it) 
{ 
    dst_map.insert(make_pair(it->first, it->second.second)); 
} 

棘手的方式( 「單行」):

std::transform(src_map.begin(), src_map.end(), inserter(dst_map, dst_map.end()), 
    boost::lambda::bind( 
     boost::lambda::constructor<pair<string,string>>(), 
     boost::lambda::bind(&strange_type_t::value_type::first, boost::lambda::_1), 
     boost::lambda::bind(&strange_pair_t::second, boost::lambda::bind(&strange_type_t::value_type::second, boost::lambda::_1)) 
    ) 
); 

的C++ 0x方式:

for_each(src_map.begin(), src_map.end(), [&dst_map](const strange_type_t::value_type& value) { 
    dst_map.insert(make_pair(value.first, value.second.second)); }); 
相關問題