gpt4 book ai didi

在 map 中搜索值的 C++ 类和方法

转载 作者:行者123 更新时间:2023-11-30 01:51:01 28 4
gpt4 key购买 nike

我已经写了一个最小类来更好地提交我的问题。

我有三个文件:

1) 测试.hpp

#include <cstdlib>
#include <stdio.h>
#include <map>

class test {
public:
test () {}
~test () {}
const char *getPin (const char *);
private:
static const std::map<const char *, const char *> pinIndex;
static std::map<const char *, const char *> initializePins ();

};

2) 测试.cpp

#include "test.hpp"

const std::map<const char *, const char *> test::pinIndex = test::initializePins ();

std::map<const char *, const char *> test::initializePins () {
std::map<const char *, const char *> pins;

pins.insert (
std::pair<const char *, const char *> (
"AAAA", "BBBB"
)
);

return pins;
}

const char *test::getPin (const char *pinNumber) {
if (pinIndex.count (pinNumber) > 0) {
return pinIndex.at (pinNumber);
}
else {
printf ("Undefined pin %s!\n", pinNumber);
exit (EXIT_FAILURE);
}
}

3) main.cpp

#include "test.hpp"

int main () {
test myExample;

const char *a = myExample.getPin ("AAAA");

exit (EXIT_SUCCESS);
}

当我编译并运行它时,我得到了这个错误:

Undefined pin AAAA!

如果我删除 main.cpp 并将主函数放在 test.cpp 文件中,我不会收到任何错误,并且 GetPin 会返回正确的值。

知道我做错了什么吗?

谢谢

最佳答案

你的问题是你正在使用 char* map 中的指针作为键值。为了在映射中查找条目,实现使用给定键的比较操作 (<)。

如果你要比较char*这些指针几乎永远不会相同,并且与它们的内容完全无关,而这正是您真正想要寻找的。

解决您的问题的一个简单方法是将您的 map 类型更改为

std::map<std::string, std::string>

另一种可能的解决方案是提供一个比较两个 char* 的类基于内容的指针作为 map 的第三个模板参数

std::map<char*, char*, MyComparer>

哪里MyComparer是某事像这样

struct MyComparer {
bool operator()( const char*& lhs, const char*& rhs ) const {
return strcmp(lhs,rhs) < 0;
}
};

在将测试移至单独的编译单元时,解释为什么您会遇到这种看似不一致的行为:
如果您有相同的字符串文字(例如 "AAAA" )多次出现在 TU 中,编译器可以将它们优化为只存储一次,因此您将拥有相同的地址用于它们的所有出现。

关于在 map 中搜索值的 C++ 类和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26637298/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com