如何有效地重用映射值

时间:2014-04-09 20:28:33

标签: c++ visual-studio-2010

该程序具有以下输入数据:

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>> >

在这两种情况下,副本的成本只是指针的副本。

感谢任何评论

1 个答案:

答案 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);
}