簡體   English   中英

即使條目相同,也找不到std :: map鍵

[英]std::map key not found even though the entries are identical

我正在學習C ++,並且一直在為std :: map和std :: string寫一個包裝器,但我偶然發現了一個問題。 每當我使用字符串作為鍵將某些東西添加到地圖時,一旦我嘗試使用完全相同的鍵來訪問該項目,就會說該鍵超出了地圖的范圍。 這是我的代碼(忽略了不相關的部分):

ADictionary.h

#ifndef ADICTIONARY_H
#define ADICTIONARY_H

#include <map>

...

template<typename KEY, typename VALUE>
class ADictionary {
public:
    ...

    VALUE operator [](KEY key) const {
        return value.at(key);
    }

    void add(KEY key, VALUE value) {
        this->value.insert(std::make_pair(key, value));
    }

    ...

private:
    std::map<KEY, VALUE> value;
};

#endif

AString.cpp

#include "AString.h"

AString::AString() {
    value = "";
}

AString::AString(const char character) {
    value = character;
}

AString::AString(const char * characters) {
    value = characters;
}

AString::AString(std::string text) {
    value = text;
}

...

AString::operator const char *() const {
    return value.c_str();
}

AString::operator const std::string() const {
    return value;
}

...

ABoolean AString::operator<(AString & text) const {
    return getLength() < text.getLength();
}

ABoolean AString::operator>(AString & text) const {
    return text < *this;
}

ABoolean AString::operator==(AString & text) const {
    return value == text.value;
}

ABoolean AString::operator!=(AString & text) const {
    return !(text == *this);
}

AString & AString::operator=(AString & text) {
    value = text.value;

    return *this;
}

...

The code which uses the above

ADictionary<AString, AString> test;
AString a = "a";
AString b = "b";
test.add(a, b);
std::cout << test[a]; // Error occurs here, according to the program "a" is not a key in the map

我希望有人可以向我解釋出了什么問題。 我嘗試用默認的std :: string作為類型創建一個字典,它可以正常工作:

ADictionary<std::string, std::string> test;
std::string a = "a";
std::string b = "b";
test.add(a, b);
std::cout << test[a]; // No error this time

就像我說過的那樣,我對C ++還是很陌生,所以可能還有其他錯誤。 如果是這樣,請隨時指出。

謝謝!

編輯:

AString.h

#ifndef ASTRING_H
#define ASTRING_H

#include <string>

#include "ABoolean.h"
#include "AInteger.h"
#include "AList.h"

class ABoolean;
class AInteger;
template<typename VALUE>
class AList;

class AString {
public:
    AString();
    AString(const char);
    AString(const char *);
    AString(std::string);
    ~AString();

    operator const char *() const;
    operator const std::string() const;
    operator const AInteger() const;

    ABoolean operator<(AString &) const;
    ABoolean operator>(AString &) const;
    ABoolean operator==(AString &) const;
    ABoolean operator!=(AString &) const;
    AString & operator=(AString &);
    AString & operator+(AString &);
    AString & operator+=(AString &);

    void clear();
    ABoolean contains(AString) const;
    AInteger getIndex(AString) const;
    AInteger getLength() const;
    AList<AString> getSplit(AString) const;
    AString getSubstring(AInteger, AInteger) const;
    void removeRange(AInteger, AInteger);
    void removeSubstring(AString);
    void toLowercase();
    void toUppercase();

private:
    std::string value;
};

AString & operator+(const char, AString &);
AString & operator+(const char *, AString &);

#endif

您的字符串運算符似乎不正確。

std :: map默認使用小於運算符。 為AString提供一個字符串時,唯一要做的就是檢查字符串的長度。 如果兩個字符串的長度相等怎么辦?

正確的做法是按字典順序比較字符串中的字符。 盡管有一個標准的庫函數可以執行此操作,但是您可以在類中使用std :: string值的運算符<:

friend bool operator<(AString const& a, AString const& b)
{
    return a.value < b.value;
}

編輯:您可能還希望刪除您的轉換運算符,或者至少使其明確,以防止出現意外的和不需要的隱式轉換。 帶有一個參數的構造函數(復制或移動構造函數除外)也應聲明為顯式的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM