unordered_map.find() 匹配不同的键
unordered_map.find() matches on different keys
我正在学习 C++。
我有在 std::unordered_map
中查找密钥的方法,如果找到密钥则 returns 为真,如果找不到则为假。
bool BufferContainer::contains(std::string *file_path) {
EditorBuffer *buf = lookup_buffer(file_path);
if (buf != NULL)
return true;
return false;
}
EditorBuffer* BufferContainer::lookup_buffer(std::string *key) {
auto buffer = buffer_map.find(key);
if (buffer == buffer_map.end())
return NULL;
return buffer->second;
}
我也有一些测试这些方法的代码。它添加一个缓冲区,然后查看其他字符串指针是否匹配。
TEST(BufferContainer, NotContainsBuffer) {
std::string name = "buffer";
std::string name2 = "buffer2";
BufferContainer container;
container.open_buffer(&name);
EXPECT_FALSE(container.contains(&name2));
}
现在的问题是,这个测试失败了。如果我在堆上创建字符串,测试会按预期成功。
TEST(BufferContainer, NotContainsBuffer) {
std::string *name = new std::string("buffer");
std::string *name2 = new std::string("buffer2");
BufferContainer container;
container.open_buffer(name);
EXPECT_FALSE(container.contains(name2));
}
这个问题有什么解决办法还是我做错了什么?
也许我应该将实际的字符串存储为键,但在我看来这会带来很多开销。
编辑:我知道我比较了地址,但我无法在最小工作示例中重现此问题。
这是完整的 "program"。
测试在 test/testeditor/test_buffer_container.cpp
。
容器的代码在 libeditor/buffer_container.cpp
中。
https://github.com/FlexW/tedit
BufferContainer
为其地图使用全局变量,不与特定的 BufferContainer
实例相关联。一个测试插入的条目在另一个测试中可见。那个全球地图充满了悬垂的指针。
碰巧 NotContainsBuffer
测试中的 name2
落在与某个先前测试插入映射中的字符串相同的堆栈位置。
我正在学习 C++。
我有在 std::unordered_map
中查找密钥的方法,如果找到密钥则 returns 为真,如果找不到则为假。
bool BufferContainer::contains(std::string *file_path) {
EditorBuffer *buf = lookup_buffer(file_path);
if (buf != NULL)
return true;
return false;
}
EditorBuffer* BufferContainer::lookup_buffer(std::string *key) {
auto buffer = buffer_map.find(key);
if (buffer == buffer_map.end())
return NULL;
return buffer->second;
}
我也有一些测试这些方法的代码。它添加一个缓冲区,然后查看其他字符串指针是否匹配。
TEST(BufferContainer, NotContainsBuffer) {
std::string name = "buffer";
std::string name2 = "buffer2";
BufferContainer container;
container.open_buffer(&name);
EXPECT_FALSE(container.contains(&name2));
}
现在的问题是,这个测试失败了。如果我在堆上创建字符串,测试会按预期成功。
TEST(BufferContainer, NotContainsBuffer) {
std::string *name = new std::string("buffer");
std::string *name2 = new std::string("buffer2");
BufferContainer container;
container.open_buffer(name);
EXPECT_FALSE(container.contains(name2));
}
这个问题有什么解决办法还是我做错了什么? 也许我应该将实际的字符串存储为键,但在我看来这会带来很多开销。
编辑:我知道我比较了地址,但我无法在最小工作示例中重现此问题。
这是完整的 "program"。
测试在 test/testeditor/test_buffer_container.cpp
。
容器的代码在 libeditor/buffer_container.cpp
中。
https://github.com/FlexW/tedit
BufferContainer
为其地图使用全局变量,不与特定的 BufferContainer
实例相关联。一个测试插入的条目在另一个测试中可见。那个全球地图充满了悬垂的指针。
碰巧 NotContainsBuffer
测试中的 name2
落在与某个先前测试插入映射中的字符串相同的堆栈位置。