如何在c ++中使用insert来设置用户定义的数据类型?

时间:2016-10-14 06:28:58

标签: c++ vector data-structures set

我想使用set<vector<data>>其中data是用户定义的类,而setvector都是 STL

class  data  
{  
    int info;  
};  

我无法理解是否需要为vector<data>data类或仅data类定义比较器运算符。 我们如何定义比较器运算符?

1 个答案:

答案 0 :(得分:1)

operator<已经有了排序 - 字典顺序 - 所以你通常不需要做任何事情。

如果使用默认向量排序,则总是需要为自己的类定义排序(请参阅下面的示例,了解您不需要的情况),最常见的方法是重载template<typename T> struct shorter_vector { bool operator() (const std::vector<T>& left, const std::vector<T>& right) const { return left.size() < right.size(); } }; // ... struct A { int x; }; std::set<std::vector<A>, shorter_vector<A>> samelengths; samelengths.insert({A{1}}); samelengths.insert({A{2}}); samelengths.insert({A{3},A{4}}); samelengths.insert({A{5},A{67}}); // set now contains {A{1}} and {A{3},A{4}}

请注意,排序关系必须是strict weak ordering,或者使用该集是未定义的。

如果你想要一套特殊的“平等”感,你需要定义自己的。

例如,这段代码会产生一个集合,其中相等长度的向量被认为是相等的(因此只有每个长度遇到的第一个被添加到集合中):

public class YourInterceptor extends HandlerInterceptorAdapter {    

    @Override
    public boolean preHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler) throws Exception {
        SomeModel model = new SomeModel();
        request.setAttribute("someValue", model );
        request.addHeader("xxx","asecret");

        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request,
            HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        //...
         response.addHeader("dummy-header, "dummy-value");
    }

    @Override
    public void afterCompletion(HttpServletRequest request,
            HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        SomeModel model = (Long) request.getAttribute("someValue");

    }

}

请注意,此集合不需要对向量元素进行排序,因为等价关系仅在结构上定义。