[英]C++/STL Default comparator
我正在編寫一個模板函數,該函數接受元素的向量並對其進行一系列操作。 這些操作之一是std :: sort()。
當然,客戶代碼需要提供比較器函子。 我不希望客戶端代碼為該參數指定值,如果它傳入了眾所周知的類型(int,字符串等)的容器中。 我應該如何定義Comp模板參數的默認值?
template<typename Container, typename Comp=????>
void my_func(Container elements, Comp comp) {
...
std::sort(elements.begin(), elements.end(), comp);
...
}
std :: sort使用“ Less”作為默認比較器。 因此,要保持一致:
template<typename Container, typename Comp = std::less<typename Container::value_type> >
void my_func(Container& elements, Comp comp = Comp())
{
std::sort(elements.begin(), elements.end(), comp);
}
#include <vector>
#include <algorithm>
template<typename Container, typename Comp=std::less<typename Container::value_type>>
void my_func(Container elements, Comp comp = Comp()) {
//...
std::sort(elements.begin(), elements.end(), comp);
//...
}
int main() {
std::vector<int> v;
my_func(v);
}
另請注意Comp comp = Comp()
我不會默認模板本身,而是將函數的參數分別設置為類似於std::greater
或std::less
的>
和<
。 std::sort
默認使用std::less
。
如果要為其獲取模板參數,則有一個建議使std::greater<>
適用於實際上被C ++ 14接受的稱為N3421的通用類型。
但是,在此之前,您可以執行std::greater<typename Container::value_type>
。 如果願意,您可以選擇使用type_traits刪除引用或cv限定詞。
<functional>
還有其他默認比較,但是這兩個是最常見的。
因此,“完整”的解決方案將是這樣的:
template<typename Container, typename Comp>
void my_func(Container& elements, Comp comp = std::less<typename Container::value_type>()) {
std::sort(elements.begin(), elements.end(), comp);
}
在您的示例中有兩個問題:
若要進行默認行為,您必須less<T>
作為函子。
您的函數正在制作副本 ,因此副本將被排序,除非您改為引用Container
。
示例如何做到這一點:
#include <functional>
template<typename Container, typename Comp=std::less<typename Container::value_type> >
void my_func(Container &elements, Comp comp = Comp() )
{
std::sort(elements.begin(), elements.end(), comp);
}
// A partial specialisation for std::list
#include <list>
template<typename ContainerValueType, typename Allocator, typename Comp=std::less<ContainerValueType> >
void my_func(std::list<ContainerValueType, Allocator> &elements, Comp comp = Comp() )
{
elements.sort(comp);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.