C++ 插入订单std::map
我将创建一个关联数组(如std::map),它按插入顺序存储元素。我写了这节课:C++ 插入订单std::map,c++,c++11,C++,C++11,我将创建一个关联数组(如std::map),它按插入顺序存储元素。我写了这节课: template <typename K, typename V> class My_Map : public std::unordered_map<K,V> { public: V& operator[]( const K&& key ) { typename std::unordered_map<K,V>::iterator __i =
template <typename K, typename V>
class My_Map : public std::unordered_map<K,V>
{
public:
V& operator[]( const K&& key )
{
typename std::unordered_map<K,V>::iterator __i = find(key);
if (__i == std::unordered_map<K,V>::end()) //se non l'ho trovato...
{
__i = insert(__i, std::make_pair(std::move(key), V()) );
mHistory.push_back(__i);std::cout<<"Sto inserendo: "<<key<<std::endl;
}
return (*__i).second;
}
typename std::unordered_map<K,V>::iterator cbegin() const
{
return *mHistory.cbegin();
}
typename std::unordered_map<K,V>::iterator cend() const
{
return *mHistory.cend();
}
private:
std::list<typename std::unordered_map<K,V>::iterator> mHistory;
};
using namespace std;
int main()
{
My_Map<string,int> myMap;
myMap["1"] = 1;
myMap["23"] = 23;
myMap["-3"] = 3;
myMap["23"] = 28;
myMap["last element"] = 33;
for (auto x = myMap.cbegin(); x != myMap.cend(); ++x)//{std::cout<<"sn dentro\n";}
cout<<(*x).first <<"\t"<<x->second<<endl;
}
模板
类My_Map:public std::无序_Map
{
公众:
V和运算符[](常数K和键)
{
typename std::无序映射::迭代器uuu i=find(键);
如果(u i==std::unordered_map::end())///se non l'ho trovato。。。
{
__i=插入(uui,std::make_pair(std::move(key),V());
mHistory.push_back(u i);std::cout第一件事是不能取消对列表的结束迭代器的引用。第二,我也怀疑yourMap.cend
是否一定可以从yourMap.cbegin
访问
看起来您可能需要一个用于列表迭代器的适配器,该适配器自动将存储的映射迭代器指针解引用到映射项
在任何情况下,您都需要迭代列表,而不是从无序_映射中的随机点到其中的另一个随机点
另外:添加元素可能会导致重新分级,这将使迭代器失效(但不是指向元素的指针或引用)。您甚至不应该将迭代器存储到无序的\u映射中。查看Boost.multi\u索引,这正是您所建议的。中也有链接映射。强烈建议不要像您这样从容器中派生(它们没有虚拟析构函数),和带前导下划线的变量名通常被认为是为编译器和标准库保留的。我可能错了,但我相当肯定无序映射不能确保插入顺序,如果您希望,可以使用std::vector of std::pair,但是您将无法通过键语义作为关联数组进行访问与PHP或其他语言一样。11111:下划线+大写或双下划线是由实现保留的,标准是这样说的,它们“通常不被认为”是保留的。它们是保留的,不要使用它们。@11111:他的类有一个std::list要保存(和遍历)插入顺序。有一种方法可以在不使用boost_multiindex的情况下解决此问题,使用相同的std::map插入语法?(myMap[myKey]=myValue;)