比较容器类型c++

compare container type c++

本文关键字:c++ 类型 比较      更新时间:2023-10-16

我有两个不同类型的容器,我需要在类型之间进行比较。

代码示例:

class A{

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

std::list只是个例子它可以是std::vector

因此我尝试这样做if:

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

我猜这不是正确的方式…我怎样才能解决这个问题呢?谢谢。

我希望我理解的是正确的。

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

您可以通过使用泛型代码来解决这个问题,它对代码的假设尽可能少。要做到这一点,可以使用std (std::begin, std::end)和泛型算法(参见std::find, std::accumulate, std::for_each, std::transform)中的泛型容器适配器。

您还可以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与自定义比较函子。

编辑(参见reference1和reference2):

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);