我想使用set<vector<data>>
其中data
是用户定义的类,而set
和vector
都是 STL ,
class data
{
int info;
};
我无法理解是否需要为vector<data>
和data
类或仅data
类定义比较器运算符。
我们如何定义比较器运算符?
答案 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");
}
}
请注意,此集合不需要对向量元素进行排序,因为等价关系仅在结构上定义。