posts - 311, comments - 0, trackbacks - 0, articles - 0
  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

我们知道,在向map中插入数据对时候,map中的元素将按照一定的顺序被插入到对应的节点上,换句话说,从map的头开始顺序地读取数据,其数据的顺序将不同于你插入时候的顺序, 例子如下:

 

std::map<double,int> dnMap;

 

dnMap[10.0] = 1;

dnMap[2.9] = 2;

dnMap[20.4] = 3;

 

std::map<double,int>::iterator it = dnMap.begin();

for(; it != dnMap.end();++it)

{

std::pair<double,int> _p = *it;

std::cout <<"Key =" <<_p.first<<" Value = "<< _p.second<< endl;

}

 

输出的顺序将是:

 

Key = Value =

 

2.9 2

10.0 1

20.4 3

 

如果map的键是用户自定义的类型T,那么你还必须在T中实现比较运算符,至于具体的细节这里就不说了。

 

但是如果你觉得map对你很合适,但是就是希望插入map中的数据保持最初插入时候的顺序,这时候怎么办?

 

让我们来看看stl中map的 声明形式 (http://www.sgi.com/tech/stl/Map.html

 

map<Key, Data, Compare, Alloc>

 

注意第三个参数

Compare : The key comparison function, a Strict Weak Ordering whose argument type is key_type; it returns true if its first argument is less than its second argument, and false otherwise. This is also defined as map::key_compare.

 

其作用就是比较Key的大小,按照一定的顺序确定map节点的顺序,我们当然就可以定制这个函数对象以实现我们想要的的排序规则。

 

好了,废话说了不少,我的做法是

 

template<class T>
struct DisableCompare :public std::binary_function<T,T,bool>
{
bool operator()(T lhs,T rhs) const
{
return true;
}
};

 

 

这样来使用定制化的map :

 

std::map<double,int,DisableCompare<double> > sMap;
sMap[10.9] = 1;
sMap[3.5] = 2;
sMap[30.0] = 3;
sMap[2.4] = 4;

 

就可以保持数据插入时候的顺序了。
结论:这种方法只适合int,double数值为Key的情况,字符串的情况不行,最后用Vector解决,方法如下:

    typedef std::pair  <WE::String,   WE::String>              SqlPair;   
    typedef std::vector
<std::pair<WE::String, WE::String > >  SqlBaseVector;

   
class SqlVector : public SqlBaseVector
   {
   
public:
       
void  push_back  (const SqlPair& sqlPair);
       
void  push_back  (const WE::String& sql, const  WE::String& tableName);

       SqlVector(){};
       
~SqlVector(){};
   };

    
class SqlMap : public SqlVector
    {     
    
public:
        
const WE::String& get_element(const WE::String& key);
        
void  set_element(const WE::String& key, const  WE::String& value);
        SqlMap(){};
        
~SqlMap(){};
    };