很快就会发现,我仍在学习C ++。
对于我正在处理的问题,我有一个类,它具有std :: map数据成员和一些在地图上运行的成员函数。我将需要一些实例,这些实例的地图以升序排序,而另一些实例则以地图的降序排序。两种情况下成员函数的代码都是相同的(类型问题除外,据我所知,为地图更改Compare函数会更改其类型)。我正在努力做到这一点,而不必为每种情况重写函数。
这是一些玩具代码,我希望可以说明我的情况(为紧凑起见,内联函数):
class MyClass {
public:
map<int, int>::iterator get_top(){ return data.begin(); }
int sum_elements(){
int sum = 0;
for ( map<int,int>::iterator it = data.begin(); it != data.end(); ++it){
sum += it->second;
}
}
};
理想情况下,我将有一个定义函数的基类和两个定义数据成员的派生类,一个用于升序,一个用于降序:
class Ascending : public MyClass {
private:
std::map<int, int, std::less<int> > data;
};
class Descending : public MyClass {
private:
std::map<int, int, std::greater<int> > data;
};
但是,这当然不起作用,因为基类需要定义数据成员才能对其进行操作。“简便”的解决方法是拥有两个独立的类,然后将成员函数复制/粘贴到这两个函数中。但这将是浪费的,而且我内心感到C ++必须能够很好地解决我的问题。
定义一个重载operator()(int, int)
(比较)函子,并将要对元素进行排序的顺序作为构造函数。这样,您可以将地图定义为std::map<int, int, SortCriterion> data(comp)
,其中comp
定义SortCriterion comp(true)
为例如升序和SortCriterion comp(false)
降序。这样,两个地图将具有相同的类型map<int, int, SortingCriterion>
。
代码如下:
#include <map>
#include <iostream>
using namespace std;
class SortCriterion
{
bool ascending;
public:
SortCriterion(bool sorting_type): ascending(sorting_type){};
bool operator()(int x, int y) const
// if not marked const,
// clang++ spits a compile-time error on insert
// however g++ compiles it ok
{
if(ascending) // ascending
return x<y;
else
return x>y;
}
};
int main()
{
// Both maps below have the SAME type, map<int, int, SortCriterion>
map<int, int, SortCriterion> m1(SortCriterion(true)); // ascending
map<int, int, SortCriterion> m2(SortCriterion(false)); // descending
m1.insert({1,1});
m1.insert({2,2});
m2.insert({1,1});
m2.insert({2,2});
cout << "First map:" << endl;
for(auto elem: m1)
cout << "[" << elem.first << "," << elem.second\
<< "]" << endl;
cout << endl << "Second map:" << endl;
for(auto elem: m2)
cout << "[" << elem.first << "," << elem.second\
<< "]" << endl;
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句