有一對迭代器[begin, end)
我想提前begin
,而條件爲真,我沒有達到end
。由於我不知道標準庫中的任何「直接」算法來做到這一點我使用:C++算法來推進迭代器,而條件爲真
std::find_if_not(begin, end, condition);
但我的問題是,該功能的名稱簡化版,表達我的意圖來推進begin
而條件是明確的。
C++標準庫中的任何算法在條件爲真時推進迭代器?
有一對迭代器[begin, end)
我想提前begin
,而條件爲真,我沒有達到end
。由於我不知道標準庫中的任何「直接」算法來做到這一點我使用:C++算法來推進迭代器,而條件爲真
std::find_if_not(begin, end, condition);
但我的問題是,該功能的名稱簡化版,表達我的意圖來推進begin
而條件是明確的。
C++標準庫中的任何算法在條件爲真時推進迭代器?
我覺得這是最容易的成語表達.. 。
while (condition (begin++));
如果你想覈對結束迭代器,只需添加的條件......
while (begin != end && condition(begin++));
這是一個不錯的小把戲(可以追溯到C),因爲它工作的事情,甚至不是技術上迭代器像...
// Consume leading whitespace
while (isspace(ch = getchar()));
我喜歡'while(begin!= end && condition(begin ++));'因爲表達比'find_if_not'更好的意圖,它也更短:) – Felics
C++ 14:
template<class...Args>
auto advance_while_true(Args&&... args) {
return std::find_if_not(std::forward<Args>(args)...);
}
但實際上,只要使用find_if_not
。該名稱可能與您對該問題的描述不符,但作爲一個std
庫算法,它的名稱相對較爲出名。
如果條件通用,寫一個包含兩個(寺廟化)迭代器幷包含其內部條件的包裝器。
template<class Iterator>
std::decay_t<Iterator> advance_while_foo(Iterator first, Iterator last) {
return std::find_if_not(std::forward<Iterator>(first), std::forward<Iterator>(last),
[](auto&& x) {
return foo(x);
}
);
}
這兩者使用std
算法的膽量(這意味着它將比更好的寫法,如果你自己編寫可能),並賦予它一個名稱(foo
),在理論上應該是合適的。
(forward
和decay_t
可能是矯枉過正。與存儲類型const&
和std::decay_t<?>
與typename std::decay<?>::type
更換auto&&
如果你不是C++ 14)
當你沒有通過轉發引用參數時,我沒有看到'forward'的點。 –
@ t.c。一些調用'advance_while_foo
爲什麼你需要一個STL算法?嘗試'while(condition){++ iter;}' – davidhigh
std :: find_if_not'在條件爲真(直到它爲假)時推進第一個迭代器,停止在第二個迭代器。這完全符合你的要求?我的意思是,**完全**?你只是不喜歡這個名字? – Yakk
那麼'find_if_not'做了什麼,但用了不同的名字呢? 'auto advance_while_true = [](auto start,auto end,auto cond){return std :: find_if_not(begin,end,cond); };' –