gpt4 book ai didi

STL - 自定义 STL 容器

转载 作者:行者123 更新时间:2023-12-02 02:37:47 27 4
gpt4 key购买 nike

我编写了代码,允许按照输入的顺序遍历映射数据。

我编写了几次代码的解决方案是:

给定键类型 K 和数据类型 D, 标准:: map std::向量

如果想随机查找数据条目,请使用 map.find(K)。当想按入口顺序遍历 map 时,使用 std::vector::iterator (begin(), end()]

这很好,但作为练习,我想将此 'OrderedMap' 编写为符合 STL 的容器。我也有(精简到这个讨论):

template <typename K, typename D>
class OrderedMapValue
{
private:
K first_ref;
std::map<K,size_t>& m;
std::vector<D>& v;
public:
const K& first
D& second
assignment operator=(const D& data)
{
std::map<K,size_t>::const_iterator iter = m.find(first_ref);
v[iter.second] = data; // error checking of iter stripped
}
};

进一步假设

template <typename K, typename D>
class OrderedMap
{
public:
typename OrderedMapValue<K,D>& OrderedMap<K,D>::operator[](const K&);
// snip...
};

class MyClass
{
public:
MyClass(std::string s) : _my_data(s) {}
private:
std::string _my_data;
};

以下代码有效:

OrderedMap<std::string,MyClass*> omap;
omap["MyKey"] = new MyClass("dummy");

但是,这段代码不会:

OrderedMap::iterator iter = omap.find("MyKey");
MyClass * obj = iter->second;
delete obj;
iter->second = new MyClass("dummy");

假设我做了某事 a)结构愚蠢或 b) 不必要的复杂,应该怎么做?

我意识到我很可能在这里重新发明轮子,但同样,这种努力主要是为了增加我对 STL 容器、它们的设计模式和正确使用的知识。

提前感谢您的任何见解,

最佳答案

我现在没有编译器来测试这个,所以可能会有错误,但我认为你更希望它是这样的:

template <typename K, typename D>
class OrderedMap
{
private:
std::map<K,size_t> &m;
std::vector<D> &v;
public:
typename pair<K,D> TYPE;

TYPE& operator[](const K &k)
{
return v[ m[ k ]];
}

TYPE& operator[](size_t idx)
{
return v[ idx ];
}

pair<iterator,bool> insert( const TYPE& pair )
{
map<K, size_t>::const_iterator iter;
iter = m.find( pair.first );

if( iter != m.end() )
return make_pair( v[ iter.second], false );

m.insert( make_pair( pair->first, v.size() ));
v.push_back( pair->second );

return make_pair( v.last() , inserted );
}

iterator &begin()
{
return v.begin();
}
// etc
};

关于STL - 自定义 STL 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/662864/

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