一、std::clamp()
其實在前面簡單介紹過這個函數,但當時只是一個集中的說明,為了更好的理解std::clamp的應用,本篇再詳細進行闡述一次。std::clamp在C++17中其定義的方式為:
template< class T >
constexpr const T& clamp( const T& v, const T& lo, const T& hi );
template< class T, class Compare >
constexpr const T& clamp( const T& v, const T& lo, const T& hi,Compare comp );
說明文檔中表明其使用“<”(c++20后使用less,所以T必須可<運算,否則未定義)或自定義comp來實現。無論使用哪種實現,其結果都是返回v(lo~hi范圍內)或返回邊界值(接近于v的lo或 hi)的引用。注意,如果lo和hi不可比較,則行為未定義。最簡單的就是lo>hi,行為即未定義。
二、應用
std::clamp的出現,解決了一個很常見的問題,就是判斷范圍。這個功能說大不大,但用處非常多,比較在實際中判斷電壓、電流的值,判斷亮度的值,判斷數值的域等等,太多了。如果不使用它,就需要自己用if語句來搞定,沒有難度,就是少寫多寫幾行代碼的事兒。
#include <algorithm>
#include <iostream>constexpr int HI = 1200;
constexpr int LO = 1;
struct Worker{int id = 0;bool operator < (const Worker&w)const{return id < w.id;}
};
int CompFun(const Worker&w1,const Worker&w2){return w1.id < w2.id;
}
int main()
{int v = 16;std::clamp(v, LO, HI);Worker loW {LO};Worker hiW {HI};Worker p1;p1.id = 10;std::cout<<"use compare func clamp value:"<< std::clamp(p1, loW, hiW,CompFun).id<<std::endl;Worker p2;p2.id = 11;std::cout<<" clamp value:"<< std::clamp(p2,loW,hiW).id<<std::endl;//std::cout<<" clamp value:"<< std::clamp(p2,hiW,loW).id<<std::endl;return 0;
}
大家可以猜一下,注釋部分的結果,再和說明比較即可明白。
三、分析說明
雖然std::clamp方便簡單,但在實踐應用中,還是需要和實際場景結合,建議如下:
1、基礎類型的判斷處理可以轉移到此函數中
2、復雜的比較要看情況,不一定非為了使用它搞一個小于運算符的重載
std::clamp之所以表現比較好,主要原因是其內聯調用相關函數,對一些比較在底層進行了優化(包括編譯優化和CPU優化等)。
不過從實際的經驗來看,std::clamp對提高效率并不是太大,所以不需要盲目的應用特別是改寫以前的比較代碼。但在一些比較重視效率或控制代碼的簡潔程度上還是有很好的作用。
四、總結
AI在發展,庫也在發展,會不會到最后,大家只要碎碎念一下,一個程序就出來?這種不是沒有可能。但是這種可能,大概率可能需要相當長的時間。其實如果真到了那個地步,為什么還要寫程序?機器人自己就搞定自己了。人類就享受一切即可。
不過到那時,可能大多數人活得更不如意!