簡體   English   中英

C++ 模板函數檢查向量是否包含值?

[英]C++ template function to check if a vector of contains the value?

我曾計划為所有類似於 FORTRAN 的類型實現一種 INDEX 函數。 這會是一個正確的解決方案嗎? ** 評論后編輯 **

template <typename T>
bool contains(std::vector<T>& vec, T value){
 if (std::any_of(vec.begin(), vec.end(), [value](T j) { return value == j; }))return true;
 return false;
}

注意:泛型實現的浮點類型比較存在一個陷阱!

如果您的程序的目標是找到正確方法的確定值:

template <typename T>
bool index(std::vector<T>& vec, T value){
  return std::any_of(vec.begin(), vec.end(), [value](T j) { return value == j; });
}

我的程序與@caleth 的答案沒有太大區別,因為為了編寫一個可以處理各種范圍的通用函數,例如std::arraystd::vector 、類C-like array或其他,你應該寫一個這樣的模板:

template <typename iter, typename T>
bool any_index(iter begin, iter end, T value) {
    for (; begin != end; ++begin) {
        if (static_cast<T>(*begin) == value) {
            return true;
        }
    }
    return false;
}

用法:

int main() {

    vector<int> v1{ 4, 3, 2, 1 };    
    vector<string> v2{ "hey", "language", "compiler", "bug" };
    vector<char> v3{ 'a', 'b','c', 'd' };
        
    array<int, 6> c{ {1,2,3,4,5,6} };
    unsigned char buf[5] = {0x11, 0x22, 0x33, 0x44, 0x55};
    
    assert(any_index(begin(v1), end(v1), 4) == true);
    assert(any_index(begin(v2), end(v2), string("compiler")) == true);
    assert(any_index(begin(v3), end(v3), 'd') == true);
    assert(any_index(begin(c), end(c), 5) == true);
    assert(any_index(begin(buf), end(buf), 0x11) == true);
          
    return 0;
}

完整示例( godbolt

是的,這是一個有效的實現,但是我會寫不同的

template <std::ranges::input_range R, typename T>
requires std::indirect_binary_predicate<ranges::equal_to, ranges::iterator_t<R>, const T*>
bool index(R&& range, const T & value){
    return std::ranges::find(range, value) != std::ranges::end(range);
}

這適用於任何序列和任何可以與該序列元素進行相等性比較的值。

在 C++11 中,沒有關於要求的明確概念,但情況類似

template <typename R, typename T>
bool index(R&& range, const T& value) {
    using std::begin, std::end;
    return std::find(begin(range), end(range), value) != end(range);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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