gpt4 book ai didi

c++ - C++ 中的 std::map 键

转载 作者:行者123 更新时间:2023-11-30 02:11:54 27 4
gpt4 key购买 nike

我需要用 C++ 创建两个不同的 map 。 Key 是 CHAR* 类型,Value 是指向结构的指针。我在不同的迭代中用这些对填充 2 张 map 。创建两个映射后,我需要找到所有这样的实例,其中 CHAR* 引用的字符串的值相同。

为此,我使用了以下代码:

typedef struct _STRUCTTYPE
{
..
} STRUCTTYPE, *PSTRUCTTYPE;

typedef pair <CHAR *,PSTRUCTTYPE> kvpair;

..

CHAR *xyz;

PSTRUCTTYPE abc;

// after filling the information;

Map.insert (kvpair(xyz,abc));


// the above is repeated x times for the first map, and y times for the second map.
// after both are filled out;

std::map<CHAR *, PSTRUCTTYPE>::iterator Iter,findIter;

for (Iter=iteratedMap->begin();Iter!=iteratedMap->end();mapIterator++)
{
char *key = Iter->first;

printf("%s\n",key);

findIter=otherMap->find(key);

//printf("%u",findIter->second);

if (findIter!=otherMap->end())
{
printf("Match!\n");
}
}

上面的代码没有显示任何匹配项,尽管两个映射中的键列表显示了明显的匹配项。我的理解是 CHAR * 的等于运算符只是等于指针的内存地址。

我的问题是,我应该如何更改此类键的等号运算符,或者我可以为字符串使用不同的数据类型吗?

最佳答案

My understanding is that the equals operator for CHAR* just equates the memory address of the pointers.

你的理解是正确的。

最简单的做法是使用 std::string 作为键。这样你就可以毫不费力地比较实际的字符串值:

std::map<std::string, PSTRUCTTYPE> m;
PSTRUCTTYPE s = bar();
m.insert(std::make_pair("foo", s));

if(m.find("foo") != m.end()) {
// works now
}

请注意,如果您不总是手动删除它们,您可能会泄漏结构的内存。如果您不能按值存储,请考虑改用智能指针。

根据您的用例,您不必存储指向结构的指针:

std::map<std::string, STRUCTTYPE> m;
m.insert(std::make_pair("foo", STRUCTTYPE(whatever)));

最后要注意的是:typedefing structs 你这样做的方式是一种 C 主义,在 C++ 中,以下内容就足够了:

typedef struct STRUCTTYPE {
// ...
} *PSTRUCTTYPE;

关于c++ - C++ 中的 std::map 键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2613537/

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