gpt4 book ai didi

c++ - std::multimap::equal_range 是否有可能返回不正确的结果?

转载 作者:行者123 更新时间:2023-11-30 03:07:08 25 4
gpt4 key购买 nike

下午好,我发现 std:multimap::equal_range 有时会返回不正确的结果。这可能吗?如果是这样,我的代码或指针的哈希函数中是否有解决方法或错误。谢谢。

这是我的代码的摘录:

typedef std::multimap<char *,Range>::const_iterator I;
std::pair<I,I> b = mmultimap.equal_range(TmpPrevMapPtr);
for (I i=b.first; i != b.second; ++i){
ranges_type.erase(i->second);
}
erasecount = mmultimap.erase(TmpPrevMapPtr);

其中 mmultimap 有一个散列指针键和一个范围值。 Range 类如下所示:

class Range { 
public:
explicit Range(int item){// [item,item]
mLow = item;
mHigh = item;
mPtr = 0;
mMapPtr = 0;
mStamp = 0;
}

Range(int low, int high, char* ptr = 0,char* mapptr, int stamp){
mLow = low;
mHigh = high;
mPtr = ptr;
mMapPtr = mapptr;
mStamp = stamp;
}

int low() const { return mLow; }
int high() const { return mHigh; }
char* getPtr() const { return mPtr; }
char* getMapPtr() const { return mMapPtr; }
int getStamp() const { return mStamp; }

private:
int mLow;
int mHigh;
char* mPtr;
char* mMapPtr;
int mStamp;
}; // class Range

最佳答案

当您想比较 C 字符串时,您正在比较 char* 指针是否相等。您需要为 multimap 提供比较仿函数或(更好)使用 std::string。考虑以下程序并注意 A1 != A2,但是 strcmp(A1, A2)==0

#include <map>
#include <string>
#include <cstring>
#include <iostream>

struct compare {
bool operator()(char *left, char *right) const {
return std::strcmp(left,right) < 0;
}
};


int main() {
char A1[] = "A";
char A2[] = "A";

std::multimap<char*, int> bad;
bad.insert(std::pair<char*,int>(A1, 1));
bad.insert(std::pair<char*,int>(A2, 1));
std::cout << bad.count("A") << ", " << bad.count(A1) << "\n";

std::multimap<char*, int, compare> good;
good.insert(std::pair<char*,int>(A1, 1));
good.insert(std::pair<char*,int>(A2, 1));
std::cout << good.count("A") << ", " << good.count(A1) << "\n";

std::multimap<std::string, int> better;
better.insert(std::pair<std::string,int>(A1, 1));
better.insert(std::pair<std::string,int>(A2, 1));
std::cout << better.count("A") << ", " << better.count(A1) << "\n";
}

关于c++ - std::multimap::equal_range 是否有可能返回不正确的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5982760/

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