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

C++ C++;:在不知道密钥的情况下插入std::map,c++,insert,key,stdmap,C++,Insert,Key,Stdmap,我需要将值插入到std::map(或它的等价物)中的任意自由位置,然后获取它的键(稍后删除/修改)。比如: std::map<int, std::string> myMap; const int key = myMap.insert("hello"); std::map myMap; const int key=myMap.insert(“hello”); 是否可能使用std::map来实现这一点,或者是否有合适的容器来实现这一点 谢谢。这是不可能的。这样的操作需要复杂的钥匙类型

我需要将值插入到std::map(或它的等价物)中的任意自由位置,然后获取它的键(稍后删除/修改)。比如:

std::map<int, std::string> myMap;
const int key = myMap.insert("hello");
std::map myMap;
const int key=myMap.insert(“hello”);
是否可能使用std::map来实现这一点,或者是否有合适的容器来实现这一点


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


您可以同时使用std::set和drop键控。

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


您可以使用std::set和拖放键控。

您可以将对象添加到std::set,然后将整个集合放入映射。但不可以,没有键就不能将值放入映射。

可以将对象添加到std::set,然后将整个集合放入映射。但是,如果没有键,您不能将值放入映射。

如果您想要实现类似于SQL数据库中自动生成主键的功能,那么您可以维护计数器并使用它生成唯一键。但是,也许std::set才是您真正需要的。

如果您想要实现类似于SQL数据库中自动生成主键的功能,那么您可以维护一个计数器并使用它生成唯一键。但是,也许std::set是您真正需要的。

最接近您想要做的事情可能是

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

std::set
相比,它的唯一优点是,您可以将整数索引传递给其他模块,而不需要它们知道
std::set::iterator
或类似的类型。

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

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

std::set
相比,它的唯一优点是,您可以将整数索引传递给其他模块,而不需要它们知道
std::set::iterator
或类似的类型。

除了使用
set
之外,您还可以保留已分配(或空闲)的 键,并在插入前找到新键。对于索引为的
地图
int
,只需获取最后一个元素并增加其键。但是 我宁愿选择一个简单的
std::vector
;如果不允许删除 支持,您可以执行以下简单操作:

int key = myVector.size();
myVector.push_back( newEntry );
如果您需要支持删除,那么使用某种类型的向量 “maybe”类型(
boost::optional
)等-您可能已经有了 你工具箱里的一个,可能是以Fallible的名字,或者可能是)可能是 适当的取决于使用模式(与之相比的删除次数)
总条目数等),您可能需要搜索向量以 重用条目。如果你真的雄心勃勃,你可以保留 自由输入,每次删除和输入时设置一个位,以及
每当您重新使用空间时都会重置它。

除了使用
集合
,您还可以保留已分配(或空闲)空间的列表 键,并在插入前找到新键。对于索引为的
地图
int
,只需获取最后一个元素并增加其键。但是 我宁愿选择一个简单的
std::vector
;如果不允许删除 支持,您可以执行以下简单操作:

int key = myVector.size();
myVector.push_back( newEntry );
如果您需要支持删除,那么使用某种类型的向量 “maybe”类型(
boost::optional
)等-您可能已经有了 你工具箱里的一个,可能是以Fallible的名字,或者可能是)可能是 适当的取决于使用模式(与之相比的删除次数)
总条目数等),您可能需要搜索向量以 重用条目。如果你真的雄心勃勃,你可以保留 自由输入,每次删除和输入时设置一个位,以及
每当您重新使用空间时都会重置它。

我认为std::map不是您想要实现的正确选择。你想干什么?将没有关联键的对象添加到字典中是没有意义的。它不是这样工作的。。。通常作为RB树实现的
映射
,没有与任何空闲插槽关联的“默认键”。您到底想实现什么?可能您正在寻找有关此主题的哈希函数-搜索信息。@Matteo Italia,我需要一种在任何数组中频繁插入/更新/删除对象的方法。我认为std::map(ordered tree?)的实现提供了查找未占用密钥的方法——不是吗?@Slav:不,它不是这样工作的。地图中没有“未占用的钥匙”。当地图没有某个键的数据时,它也没有键本身的数据。当你有一个空的
map
时,你有超过40亿个“未占用的密钥”…我认为std::map不是你想要实现的正确选择。你想干什么?将没有关联键的对象添加到字典中是没有意义的。它不是这样工作的。。。通常作为RB树实现的
映射
,没有与任何空闲插槽关联的“默认键”。您到底想实现什么?可能您正在寻找有关此主题的哈希函数-搜索信息。@Matteo Italia,我需要一种在任何数组中频繁插入/更新/删除对象的方法。我认为std::map(ordered tree?)的实现提供了查找未占用密钥的方法——不是吗?@Slav:不,它不是这样工作的。地图中没有“未占用的钥匙”。当地图没有某个键的数据时,它也没有键本身的数据。当你有一张空的
地图时,
你有超过40亿“未占用的钥匙”…这是一个聪明的把戏。唯一的问题是是否有删除;您可能会得到一个已经使用过的索引。l什么的