2017-07-19 45 views
2

我嘗試構建一個模板函數,該函數獲取vectorarray(必須將未知容器傳遞給函數)的2個迭代器(beginend)。未知容器,向量或數組的大小C++

  1. 我希望函數將檢查傳遞給它的容器的大小。 我的問題是:如果begin iterator等於end iterator這是否意味着0或1容器內的元素? 我怎麼能decalare一些通用尺寸類型?

  2. 如果我想通過傳遞迭代器來對未知容器進行排序來排序函數是成爲一個問題?我有些感覺它不起作用。

這是我的模板函數的草案:

template<class P, class T> 
    T my_func(P beg, P end) 
    { 
     typedef typename ??? container_size; 
     if (beg == end)//first problem to determine if contains 0 or 1 
         elements 

     throw domain_error("some message if 0 elements"); 

     sort(beg, end);// scond problem 

    } 
+2

['std :: distance'](http://en.cppreference.com/w/cpp/iterator/distance)。 'begin == end' <=>'size == std :: distance(begin,end)== 0'。 – BoBTFish

+1

'''begin'''等於''''end'''表示容器是空的 –

+0

C++標準庫迭代器總是使用begin迭代器是包含性的,並且end迭代器是獨佔的(參考one-過去最末尾)。 –

回答

8
  1. 我想,該功能將檢查傳遞給它的容器的大小。我的問題是:如果開始迭代器等於結束迭代器是否意味着0或1個容器內的元素?我怎麼能decalare一些通用尺寸類型?

您應該使用std::distance

  • 如果我要排序通過使迭代未知容器排序功能是成爲問題?我有些感覺它不起作用。
  • 它的工作,所提供的迭代器是RandomAccessIterators和值類型是swappable


    所以,你的代碼可能是:

    template<class P, class T> 
    T my_func(P first, P last) 
    { 
        if(first == last) // No elements within the range 
         throw domain_error("some message if 0 elements"); 
    
        //Number of Elements within the range 
        auto container_size = std::distance(first, last); 
    
        std::sort(first, last); 
    
        return ...; 
    } 
    

    如果我的猜測是正確的,模板參數T應該是迭代器的值類型,您可以使用std::iterator_traits<T>::value_type

    +0

    這是一個簡短而準確可靠的答案。我希望看到更多類似的內容。優秀。 – YSC

    +0

    @WhiZTiM如果容器在內存中不是順序的,那麼距離函數如何知道容器內的每個元素有多少個字節? – axcelenator

    +0

    @axcelenator'distance'會嘗試類似於'for(; first!= last; first ++)n ++;' –