我知道这可能是一个愚蠢的问题。但我仍然有一个困惑。
W.r.t std::map。我已经为地图的动态排序编写了一个自定义谓词,
enum OrderingType
{
ASCENDING,
DESCENDING
};
template <class T>
class Ordering
{
OrderingType m_order;
public:
Ordering(OrderingType order) : m_order(order) { }
bool operator() (const T &obj1, const T &obj2)
{
if( m_order == ASCENDING )
return obj1 < obj2;
if( m_order == DESCENDING )
return obj1 > obj2;
}
};
优点是
-
我们可以在某些条件下决定地图中数据元素的顺序
订单类型类型=(条件?升序:降序);
CUSTOMMAP m(类型);
-
我们可以对升序和降序映射使用相同的前向迭代器
在下面的代码中。地图的排序在升序和降序( amp1 和 map2 )中都可以正常工作。但在赋值map2=map1时,map2的顺序随着内容而改变。我应该只复制内容,而不是顺序的更改。 map2 上的进一步插入(已声明为降序)将按升序排列。
有什么建议或想法吗..?或者为地图定义两种方式排序谓词是个坏主意..?
typedef map<int, int, Ordering<int> > CUSTOMMAP;
typedef CUSTOMMAP::iterator CUSTOMMAP_ITER;
typedef CUSTOMMAP::const_iterator CUSTOMMAP_CONST_ITER;
ostream& operator <<(ostream& out, const CUSTOMMAP& mapobj)
{
CUSTOMMAP_CONST_ITER citer = mapobj.begin();
for( ; citer != mapobj.end(); ++citer )
{
out << citer->first << " " << citer->second << endl;
}
out << "==========" << endl;
return out;
}
int main()
{
CUSTOMMAP map1(ASCENDING); //instantiate a map with ascending sorting
CUSTOMMAP map2(DESCENDING); //instantiate a map with descending sorting
map1.insert( make_pair(1, 0));
map1.insert( make_pair(2, 0));
cout << map1; // prints data in ascnding manner
map2.insert( make_pair(5, 0));
map2.insert( make_pair(6, 0));
cout << map2; // prints data in descending manner
map2 = map1;
cout << map2; //copys contents of map1 to map2 & changes
//map2's ordering predicate
return 0;
}
设置良好map2 = map1
实际上将复制整个对象,而不仅仅是元素。那么你可能想做的是
map2.clear();
map2.insert(map1.begin(), map1.end());
我突然相信这两个步骤的复杂性将是O(n log n)
,但不要引用我的话。
Edit
甚至更好(O(n)
):
map2.clear();
map2.insert(map1.rbegin(), map1.rend());
“对于第三个版本( insert (first,last) ),一般为 Nlog(size+N) (其中 N 是第一个和最后一个之间的距离,大小是插入之前容器的大小),但如果元素是线性的第一个和最后一个之间已经根据容器使用的相同排序标准进行排序。” (http://cplusplus.com/reference/stl/map/insert)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)