C ++:在不知道密钥的情况下插入std :: map

时间:2011-09-22 09:49:56

标签: c++ insert key stdmap

我需要将值插入std :: map(或它等效)到任何空闲位置,然后获取它的键(稍后删除/修改)。类似的东西:

std::map<int, std::string> myMap;
const int key = myMap.insert("hello");

是否可以使用std :: map或者是否有适当的容器?

谢谢。

5 个答案:

答案 0 :(得分:2)

除了使用set之外,您还可以保留已分配(或免费)的列表 密钥,并在插入之前找到新密钥。对于索引的map int,您可以简单地取最后一个元素,并递增其键。但 我宁愿认为我会选择一个简单的std::vector;如果删除不是 支持,你可以做一些简单的事情:

int key = myVector.size();
myVector.push_back( newEntry );

如果你需要支持删除,那么使用某种类型的向量 “也许”类型(boost::optional等等 - 你可能已经拥有了 一个在您的工具箱中,可能名为Fallible或Maybe) 适当。取决于使用模式(删除的数量与 总条目等),您可能想要搜索向量 重用条目。如果你真的雄心勃勃,你可以保留一个位图 免费条目,每次删除和输入时设置一点,以及 重复使用空间时重置它。

答案 1 :(得分:1)

您可以将对象添加到std :: set,然后将整个集合放入地图中。但不,你不能在没有钥匙的情况下将价值放入地图。

答案 2 :(得分:1)

最接近你要做的事情可能是

myMap[myMap.size()] = "some string";

这比std::set的唯一优势是你可以将整数索引传递给其他模块而不需要知道std::set<Foo>::iterator或类似的类型。

答案 3 :(得分:0)

这是不可能的。这种操作需要复杂的密钥类型知识才能知道哪些密钥可用。例如,std :: map必须为int映射增加int值,或者附加到字符串映射的字符串。

你可以使用std :: set并完全删除键控。

答案 4 :(得分:0)

如果要在SQL数据库中实现与自动生成的主键类似的操作,则可以维护计数器并使用它来生成唯一键。但也许std :: set是你真正需要的。