我有一个 std::unordered_map 存储一个带有对象的整数。这里有一些代码供您理解:
#include <iostream>
#include <unordered_map>
#include <cstdlib>
using namespace std;
class Foo
{
public:
Foo()
{
cout << "Foo created!" << endl;
}
~Foo()
{
}
};
typedef std::unordered_map<int, Foo*> FooMap;
FooMap fm;
int allocateID()
{
cout << "Allocating ID" << endl;
return rand() % 100;
}
void add()
{
fm.emplace(allocateID(), new Foo());
}
int main()
{
srand(time(NULL));
add();
return 0;
}
输出:
Foo created!
Allocating ID
这里的问题是对象 Foo
是在 分配 ID 之前创建的!我尝试在 allocateID
上添加一个互斥锁;它不起作用,因为 allocateID()
在对象创建后 运行。
如何修改此程序,以便在分配 ID 之后创建 Foo
?
编辑:
我试过代码并使用此处的解决方案来演示:
void add(int id, Foo *f)
{
auto iden = id;
auto foo = f;
fm[iden] = foo;
}
void add(Foo *f, int id)
{
auto iden = id;
auto foo = f;
fm[iden] = foo;
}
void add()
{
int id = allocateID();
fm[id] = new Foo();
}
在第一个 add()
函数中,输出保持不变。这不能解决问题。
在第二个 add()
函数中,输出不同,而是产生:
Allocating ID
Foo created!
而在第三个函数中,它已使用其中一种解决方案进行了修改:该函数也产生了所需的输出。第三个函数的问题是,实际上不太可能有一个空的 add()
函数。解决这个问题的唯一有罪的方法是先传递对象然后 id。这可能是因为无论输入要求如何,参数都是从右到左读取的,因为它们是在读取参数之后创建的。
最佳答案
您不能依赖函数参数的求值顺序。试试这个:
void add()
{
int temp = allocateID();
fm.emplace(temp, new Foo());
}
关于c++ - 在 std::unordered_map 中分配 ID 后创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34094159/