我经历了很多关于这个问题的问题,但仍未找到我可以使用的答案。
我有一个模板类,声明如下:
template <typename Type, int inSize>
class sortedVector
{
public:
sortedVector();
int getSize();
int getAmountElements();
bool add(const Type &element);
private:
Type *vector;
int size;
int amountElements;
};
该类应该表示可以存储任何类型元素的有序向量。这是编程课程作业的一部分。到目前为止,似乎赋值中给出的main函数将整数和Polygon类型的对象传递给函数。 Polygon是我之前完成的课程。
矢量应该按照传递的多边形对象的区域进行排序,当然也可以按传递的int的值进行排序。
为此,我想我需要两种不同的add实现(const Type&amp; element)。一个负责将int放入向量的正确位置,另一个负责获取多边形的区域并将其插入向量中的正确位置。
我们谈论AFAIK关于模板的专业化。
我尝试了几种不同的方法,但到目前为止只是遇到了编译器错误。什么是实现这一目标的最佳方式?
答案 0 :(得分:2)
在C ++中,维护排序的容器通常会有一个用于比较仿函数的模板参数,用于确定元素的排序。例如,请查看std::set
:
template<typename Key, typename Compare = std::less<Key>, class Allocator = allocator<Key>>
class set;
您可以跳过此练习的分配器。默认的Compare
仿函数将使用operator<
,但如果我想使用不同的东西,我可以像这样实例化set
:
typedef std::set<int, std::greater<int> > MySet;
因此,您无需在此处使用专业化。你怎么能 无论如何?你不可能专注于你的所有课程 排序的矢量可以使用,因为你永远不知道有多少 他们在那里。
所以这会使sortedVector
的声明看起来像这样:
template<typename Elem,
typename Compare = std::less<Elem> >
class sortedVector {
public:
// take the functor as a constructor argument in case it cannot be
// default constructed
sortedVector(Compare c = Compare()) : cmp_(c) {}
// ...snip...
void push_back(const Elem& x) {
cont_.push_back(x);
std::sort(begin(cont_), end(cont_), cmp_);
}
private:
// trick just use a std::vector as storage and guarantee our sorted invariant
std::vector<Elem> cont_;
// we need to store the comparison functor in case it has state
Compare cmp_;
};
#include<iostream>
int main(){
long long num;
std::cin>>num;
std::cout<<num;
}