排序指针c ++和比较类型的容器

时间:2014-05-16 15:56:41

标签: c++ sorting containers

我需要排序容器。 但我从模板中获取容器的类型.. beacouse这个我需要std::sort使用std::vectorname.sort使用std::list。 因此,我需要检查容器的类型,以便选择做什么。

我试着这样做:

class sor {
public:
    sor(){}
    bool operator( )(Course* l, Course* r) {
        return l->getNumber() < r->getNumber();
    }
};



if (typeid(courses) == std::list){
    //do something...
}
else{
   //do...
} 

我该怎么做? 感谢

3 个答案:

答案 0 :(得分:3)

你可以重载你自己的排序功能

template<typename T, typename Compare>
void sort(std::list<T>& list, Compare compare)
{
    list.sort(compare);
}

template<typename T, typename Compare>
void sort(std::vector<T>& vector, Compare compare)
{
    std::sort(vector.begin(),vector.end(),compare);
}

答案 1 :(得分:1)

std::sort算法在某种程度上与容器无关(它要求迭代器满足ValueSwappableRandomAccessIterator的要求),因此您可以像以下一样使用它:

std::sort(container.begin(), container.end(), sor());

不幸的是,std::list不满足RandomAccessIterator


如果您有一个接受任何容器类型的模板函数,您可以为它提供特化。或者,使用type traits,您可以提供更多通用模板“重载”:

template<class... Args, template<class...> class Container>
void sort(Container<Args...>&) { ... }

template<class... Args>
void sort(std::list<Args...>&) { ... }

Live demo

答案 2 :(得分:0)

您可以使用type traitstag dispatching查看以下代码:

#include <iostream>
#include <list>
#include <vector>
#include <algorithm>
#include <functional>

struct vectorlike_tag { };
struct listlike_tag   { };

template <typename C> struct container_traits;

template <typename T, typename A>
struct container_traits<std::vector<T, A>> {
  typedef vectorlike_tag category;
};

template <typename T, typename A>
struct container_traits<std::list<T, A>> {
  typedef listlike_tag category;
};

template <typename Container, typename Compare>
void sort_helper(Container& c, Compare f, vectorlike_tag) {
  std::sort(c.begin(), c.end(), f);
}

template <typename Container, typename Compare>
void sort_helper(Container& c, Compare f, listlike_tag) {
  c.sort(f);
}

template <typename Container, typename Compare>
void sort_container(Container &c, Compare f) {
  sort_helper(c, f, typename container_traits<Container>::category());
}

template<class Container>
void sort_container(Container &c)
{
  sort_helper(c, std::less<typename Container::value_type>(), typename container_traits<Container>::category());
}

int main()
{
  std::vector<int> v{ 4, 3, 7, 8, 9 };
  sort_container(v);
  for (auto e : v) std::cout << e << " ";
  std::cout << std::endl;
  std::list<int> lst{ 4, 3, 7, 8, 9 };
  sort_container(lst, std::greater<int>());
  for (auto e : lst) std::cout << e << " ";
  std::cout << std::endl;
  return 0;
}

输出:

  

3 4 7 8 9

     

9 8 7 4 3