该程序具有以下输入数据:
std::map<std::string, std::vector<int> >
现在我需要将此数据结构转换为以下内容:
std::map<int, std::vector<int> >
例如:
"key1" => 1
"key2" => 20
etc.
只更改了键类型,映射的值不变。
问题是我如何有效地重用映射键std::vector<int>
,以便不复制映射的值,因为没有必要这样做。
以下是我想到的两个想法:
/////////////////////////////////////////////// /////
解决方案1&gt;
重新定义界面 来自
std::map<int, std::vector<int> >
到
std::map<int, std::vector<int>* >
/////////////////////////////////////////////// /////
溶液2&gt; 重新定义界面 从:
std::map<std::string, std::vector<int> >
std::map<int, std::vector<int> >
为:
std::map<std::string, boost::shared_ptr<std::vector<int>> >
std::map<int, boost::shared_ptr<std::vector<int>> >
在这两种情况下,副本的成本只是指针的副本。
感谢任何评论
答案 0 :(得分:1)
C ++ 11提供了移动操作,可以将一个对象移动到另一个对象而无需复制。 VS 2010应该有必要的机制实施。有了这个,假设您有旧密钥到新密钥的映射,您可以重新映射这样的数据:
std::map<std::string, std::vector> m1;
std::map<int, std::vector> m2;
std::map<std::string, int> keymap;
for (auto i=m1.begin(); i != m1.end(); ++i)
{
m2[keymap[i->first]] = std::move(i->second);
}
现在,所有向量都已移动到新地图,使地图m1处于未定义但可破坏的状态。
如果C ++ 11(在VS2010中可用)不是一个选项,请将旧地图与旧地图交换:
std::map<std::string, std::vector> m1;
std::map<int, std::vector> m2;
std::map<std::string, int> keymap;
for (std::map<std::string, std::vector>::iterator i=m1.begin(); i != m1.end(); ++i)
{
m2[keymap[i->first]].swap(i->second);
}