【问题标题】:std::map find not working in C++ [duplicate]std::map 发现在 C++ 中不起作用 [重复]
【发布时间】:2016-06-14 07:49:04
【问题描述】:

我使用以下几行创建了一个哈希映射和一个迭代器:

std::map<const char*,vaLueClass *> myCache;
std::map<const char*,vaLueClass *>::iterator myCacheIterator;

然后我使用以下行插入此地图:

myCache[anotherObject->getStringKey()] = new vaLueClass(anotherObj1->getIntAttr(), anotherObj1-->getIntAttr());

然后,每当我尝试使用下面的行搜索此映射或 nut 中是否存在特定字符串的 ENTRY 时,它总是进入 IF 块,换句话说,它在里面找不到任何条目这张地图。

myCacheIterator= myCache.find(sampleObject->getstringKey());

注意:这里sampleObject-&gt;getstringKey() 返回之前插入的相同密钥。

if (myCacheIterator.operator ==(myCache.end())){
   // this block means that no matched entry is found inside the map myCache
}

另外,这是在 C++ 中创建和使用 std::map 的正确方法吗?如果没有,请推荐一个。

另外,我没有使用关键字new 来创建std::map 对象。

【问题讨论】:

  • 你是在比较字符串数据还是指针持有的地址?
  • 我想检查此地图中是否存在具有特定 (const char *) 键的条目
  • @user3243499 如果要使用字符串和键,请使用字符串作为键,而不是 const char *。换句话说,使用std::string 作为键值。
  • 好的,如果我使用 std::string 而不是 const char * 那么请建议我的 IF(condition) 语句的示例替换,以检查我的哈希映射中是否存在特定的字符串键
  • @user3243499 为什么你认为你需要改变什么? map::find 如果您返回的是指向(以空结尾的)字符序列的指针,则可以正常工作。

标签: c++ string c++11 stl omnet++


【解决方案1】:

std::map 中,执行搜索时使用小于operator &lt; 比较键。由于您将const char* 存储为键,这意味着查找将比较指针本身而不是它们指向的字符串,因此如果您不传入用于插入映射的确切指针,则查找不会找到任何东西。

我认为这里最简单的解决方法是使用std::strings 作为您的键,因为std::string 上的&lt; 运算符实际上比较了底层文本。这应该很快就能解决您的问题。

【讨论】:

  • 在这一行myCache[anotherObject-&gt;getStringKey()] = new vaLueClass(anotherObj1-&gt;getIntAttr(), anotherObj1--&gt;getIntAttr()); anotherObject-&gt;getStringKey() 实际上返回一个const char * 我用它来插入这个地图。因此,当我使用 find 方法时,我可能使用了不同的 const char * 指针,但具有相同的字符串。我应该怎么做才能做到这一点?
  • 按照建议,使用std::string 而不是const char *。问题解决了。此外,您可以使用不同的const char * 值指向相同的字符序列。没有什么能阻止编译器为字符串文字“xyz”提供与在程序中其他地方找到的“xyz”不同的地址。
  • 在将其从 const char * 更改为 std::string 后完美运行。理清了我的概念。谢谢。
【解决方案2】:

你可以有几个选项来解决这个问题:

1) 你可以使用 std::string 代替 const char *

template<
    class Key,
    class T,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<std::pair<const Key, T> >
> class map;

2) 地图声明见上图。第三个模板参数是比较函子。您可以将自定义函子传递给您的地图以实现正确的行为。

3) std::less 使用 operator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 2014-04-15
    相关资源
    最近更新 更多