2015-01-05 29 views
0

有一對迭代器[begin, end)我想提前begin,而條件爲真,我沒有達到end。由於我不知道標準庫中的任何「直接」算法來做到這一點我使用:C++算法來推進迭代器,而條件爲真

std::find_if_not(begin, end, condition); 

但我的問題是,該功能的名稱簡化版,表達我的意圖來推進begin而條件是明確的。

C++標準庫中的任何算法在條件爲真時推進迭代器?

+1

爲什麼你需要一個STL算法?嘗試'while(condition){++ iter;}' – davidhigh

+5

std :: find_if_not'在條件爲真(直到它爲假)時推進第一個迭代器,停止在第二個迭代器。這完全符合你的要求?我的意思是,**完全**?你只是不喜歡這個名字? – Yakk

+7

那麼'find_if_not'做了什麼,但用了不同的名字呢? 'auto advance_while_true = [](auto start,auto end,auto cond){return std :: find_if_not(begin,end,cond); };' –

回答

1

我覺得這是最容易的成語表達.. 。

while (condition (begin++)); 

如果你想覈對結束迭代器,只需添加的條件......

while (begin != end && condition(begin++)); 

這是一個不錯的小把戲(可以追溯到C),因爲它工作的事情,甚至不是技術上迭代器像...

// Consume leading whitespace 
while (isspace(ch = getchar())); 
+0

我喜歡'while(begin!= end && condition(begin ++));'因爲表達比'find_if_not'更好的意圖,它也更短:) – Felics

2

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),在理論上應該是合適的。

forwarddecay_t可能是矯枉過正。與存儲類型const&std::decay_t<?>typename std::decay<?>::type更換auto&&如果你不是C++ 14)

+0

當你沒有通過轉發引用參數時,我沒有看到'forward'的點。 –

+0

@ t.c。一些調用'advance_while_foo '的git ...我應該在實踐中'std :: move'這個'iterator's。添加'decay_t'來使返回值成爲一個值,而不是引用,以防有人執行無禮的事情。就像我說的,可能是矯枉過正。 – Yakk