2009-08-20 119 views

回答

5

一个multimap<int,int>的值类型为pair<int,int> - 您希望您的矢量持有什么。所以,你可以使用构造从多重映射初始化向量:

std::vector< std::pair<int,int> > v(mmap.begin(), mmap.end()); 

或者,如果您有现成的载体,你要复制的元素:

v.resize(mmap.size()); 
std::copy(mmap.begin(), mmap.end(), v.begin()); 

您也可以使用std::back_inserter,但是这将由于矢量重新分配是在一般较慢:

std::copy(mmap.begin(), mmap.end(), std::back_inserter(v)); 

EDIT 要回答你的其他问题 - 你可以用类似的方法将矢量转换成多图。 multimap中还具有接受一个迭代范围内的构造:

std::multimap<int,int> mmap(v.begin(), v.end()); 

这当然,假定vstd::vector< std::pair<int,int> >

+0

C++中关联容器的值类型有一个常量键。即:标准:: multimap中 :: VALUE_TYPE是标准::对。其原因是,如果该键是不恒定的,也可能是通过非const迭代器打破容器不变量发生变化(该元素将是一个错误的位置上的密钥更新后) – 2009-08-21 06:59:36

1

麻烦我相信,天真的方法也是最有效的一个:遍历multimap中,每一个元素添加到矢量。作为优化,您应该在开始之前v.reserve(m.size)

的元素通常被存储在一个树中的多重映射,在散布在堆中的对象。对于载体,它们必须处于连续记忆中:这要求你真的必须将它们复制在一起。

+0

OK,然后是有可能做的for_each? – yesraaj 2009-08-20 07:00:16

+1

无需:矢量::分配(ITER开始,Iter项目结束)是一个单一的操作这需要两个存储器allcoation和环路的照顾。 – MSalters 2009-08-20 07:27:45

相关问题