C++ 映射实现

C++ 映射实现,c++,map,C++,Map,我正在尝试制作自己的map实现。 MyMap.h: #pragma once #include <set> #include <list> #include <utility> template <class Key, class Value> class MyMap { public: MyMap(); ~MyMap(); int count(Key&); Value& operator[](K

我正在尝试制作自己的map实现。 MyMap.h:

#pragma once

#include <set>
#include <list>
#include <utility>

template <class Key, class Value> class MyMap
{
public:
    MyMap();
    ~MyMap();
    int count(Key&);
    Value& operator[](Key&);
private:
    std::set<Key> m_keys;
    std::list<std::pair<Key, Value*> > m_kvList;
};
#pragma一次
#包括
#包括
#包括
模板类MyMap
{
公众:
MyMap();
~MyMap();
整数计数(键&);
值和运算符[](键和);
私人:
设置m_键;
std::list m_kvList;
};
MyMap.cpp

#include "stdafx.h"
#include "MyMap.h"

MyMap<class Key, class Value>::MyMap()
{

}


MyMap<class Key, class Value>::~MyMap()
{

}

int MyMap<class Key, class Value>::count(Key& k)
{
    if (m_keys.find(k) != m_keys.end())
        return 1;
    return 0;
}

Value& MyMap<class Key, class Value>::operator[](Key& k)
{
    if (count(k) == 0)
    {
        m_keys.insert(k);
        Value* pValue;
        std::pair<Key, Value*> kvPair(k, pValue);
        m_kvList.push_back(kvPair);
        return *pValue;
    }
    std::list<std::pair<Key, Value*> >::const_iterator it;
    for (it = m_kvList.begin(); it != m_kvList.end(); it++)
    {
        if ((*it).first == k)
            return *(*it).second;
    }
}
#包括“stdafx.h”
#包括“MyMap.h”
MyMap::MyMap()
{
}
MyMap::~MyMap()
{
}
int MyMap::count(键和k)
{
if(m_keys.find(k)!=m_keys.end())
返回1;
返回0;
}
值和MyMap::运算符[](键和k)
{
如果(计数(k)==0)
{
m_键。插入(k);
值*pValue;
std::对kvPair(k,pValue);
m_kvList.向后推(kvPair);
返回*pValue;
}
std::list::const_迭代器it;
for(it=m_kvList.begin();it!=m_kvList.end();it++)
{
if((*it).first==k)
返回*(*it)。第二;
}
}
主代码cpp

#include "stdafx.h"
#include <iostream>
#include <string>
#include "MyMap.h"

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    MyMap<int, int> m1;
    m1[3] = 60;
    m1[1] = 30;
    m1[2] = 95;
    return 0;
}
#包括“stdafx.h”
#包括
#包括
#包括“MyMap.h”
使用名称空间std;
int _tmain(int argc,_TCHAR*argv[]
{
MyMap-m1;
m1[3]=60;
m1[1]=30;
m1[2]=95;
返回0;
}
它告诉我,问题在于地图中的赋值

no operators "[]" matches these operands. operand types are MyMap<int, int> [int]
没有与这些操作数匹配的运算符“[]”。操作数类型为MyMap[int]

我真的不明白我写的东西有什么错,因为[]运算符的重载使用了一个键,而本例中的键被设置为int,因此我将int值传递给[]运算符,编译器仍在抱怨。

您需要通过
const
引用获取键:
value&operator[](const-Key&)。非常量左值引用无法绑定到右值。我的眼睛可能不好,但是如果返回一个未初始化的取消引用指针
pValue
,那么
操作符[]
将如何工作?我认为您有一个设计问题:您当前使用
似乎只是为了保证唯一性。然后,使用
列表
存储实际的键/值对。这对于访问来说非常复杂,因此您的数据结构更像是一个唯一的列表,而不是一个映射。您可以使用
std::set
来实现
map
,尽管我不太明白这样做的意义:您可以编写一个自定义的键/值对结构,并提供一个自定义比较器,该比较器只比较两个这样的结构对象的键。@dikson231还请注意,在单独的
文件中的实现将不起作用: