比较容器类型c ++

时间:2014-05-16 14:05:30

标签: c++ types compare containers typeid

我有2个不同类型的容器,我需要比较各种类型。

代码示例:

class A{


private:

std::list<Course*>  courses;
};

std::list就是一个例子,它可以是std::vector

因此我尝试这样做if

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

这不是我猜的正确方法.. 我该如何解决这个问题? 感谢。

1 个答案:

答案 0 :(得分:0)

我希望我能理解你的要求。

通常,如果您的代码要求您执行类型转换或类型比较,则表明存在设计问题。

您可以通过使用通用代码来解决这个问题,该代码尽可能少地对代码做出假设。为此,请在std(std :: begin,std :: end)和泛型算法中使用通用容器适配器(请参阅std :: find,std :: accumulate,std :: for_each,std :: transform)。

您还可以typedef数据类型,并根据typedef(及相关类型)编写所有内容。

示例:

class A{
    typedef std::list<Course*> courseptr_sequence; // consider 
        // either shared_ptr or unique_ptr instead of raw*


    courseptr_sequence  courses;
public:
    // an advanced course is - for this example
    // a course where Course::advanced() evaluates to true
    void find_advanced_courses(std::ostream& out) const
    {
        auto advanced = std::find_if(std::begin(courses), std::end(courses),
            [](Course* p){ return p->advanced(); });
        if(advanced != std::end(courses))
            out << *(*advanced);
    }
};

通过这种实现,您可以在typedef中更改容器类型,其余的将编译好。

编辑:如果你的问题是两个不同的容器类型,你比较相应位置的元素(元素有不同的类型),答案是使用std :: equal和自定义比较函子。

修改(请参阅reference1reference2):

template <class N>
struct is_list { static const int value = 0; };

template <class N, class A>
struct is_list<std::list<N, A> > { static const int value = 1; };

template <typename T> using negate = std::integral_constant<bool, !T::value>;

template<typename C>
void user3630497_sort(std::enable_if<
         negate<is_list<C>::value>::value, C>::type& container)
{
    std::sort(std::begin(container), std::end(container));
}

template<typename C>
void user3630497_sort(std::enable_if<
         is_list<C>::value, C>::type& container)
{
    container.sort();
}

用法:

std::list<Course*> l;
user3630497_sort(l);

std::vector<Course*> v;
user3630497_sort(l);