2011-06-02 64 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)); }); 
相关问题