簡體   English   中英

C ++ / STL默認比較器

[英]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::greaterstd::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);
}

在您的示例中有兩個問題:

  1. 若要進行默認行為,您必須less<T>作為函子。

  2. 您的函數正在制作副本 ,因此副本將被排序,除非您改為引用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM