gpt4 book ai didi

c++ - 使用 C++ STL 将 C 风格的字符串映射到 int?

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

stringint 的映射工作正常。

std::map<std::string, int> // working

但我想将 C-style 字符串映射到 int

例如:

char A[10] = "apple";
map<char*,int> mapp;
mapp[A] = 10;

但是当我尝试访问映射到“apple”的值时,我得到的是垃圾值而不是 10。为什么它的行为与 std::string 不同?

最佳答案

map<char*,int> mapp;

这里的键类型不是“c string”。至少不是,如果我们将 c 字符串定义为“字符数组,带有空终止符”。 key 类型,即 char* , 是指向字符对象的指针。区别很重要。您没有在 map 中存储字符串。您正在存储指针,而字符串位于其他地方。

除非您使用自定义比较函数对象,std::map使用 operator<(const key_type&,key_type&)默认情况下。当且仅当它们指向同一个对象时,两个指针才相等。

下面是三个对象的例子:

char A[] = "apple";
char B[] = "apple";
const char (&C)[6] = "apple"

前两个是数组,第三个是绑定(bind)到也是数组的字符串文字对象的左值引用。作为独立的对象,它们的地址当然也不同。所以,如果你要写:

mapp[A] = 10;
std::cout << mapp[B];
std::cout << mapp[C];

每个输出都为 0,因为您还没有初始化 mapp[B]也不mapp[C] ,因此它们将由 operator[] 初始化值.键值不同,即使每个数组包含相同的字符。

解决方案:不要使用 operator<比较指向 c 字符串的指针。使用 std::strcmp反而。与 std::map ,这意味着使用自定义比较对象。但是,您还没有完成警告。您仍然必须确保字符串必须保留在内存中,只要它们被映射中的键指向。例如,这将是一个错误:

char A[] = "apple";
mapp[A] = 10;
return mapp; // oops, we returned mapp outside of the scope
// but it contains a pointer to the string that
// is no longer valid outside of this scope

解决方案:注意范围,或者只使用 std::string .

关于c++ - 使用 C++ STL 将 C 风格的字符串映射到 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38446847/

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