16 Nisan 2018 Pazartesi

std::prev metodu

Giriş
Açıklaması şöyle
std::prev doesn't modify itr. So, it is better when itr shouldn't or couldn't be modified. --itr and std::advance do modify itr, so they are better when itr must be modified.
Bu metod std::next() çağrısının tersini yapar.

std::prev - iterator + int
Örnek
Elimizde 2'dan fazla eleman içeren bir liste olsun. Sondan ikinci elemanı almak için şöyle yaparız.
if (foo.size() >= 2){
    double value = *std::prev(foo.end(), 2)}
Diğer
Açıklaması şöyle.
Although the expression --c.end() often compiles, it is not guaranteed to do so: c.end() is an rvalue expression, and there is no iterator requirement that specifies that decrement of an rvalue is guaranteed to work. In particular, when iterators are implemented as pointers, --c.end() does not compile, while std::prev(c.end()) does.
std::prev() bazı durumlarda mecburi olabiliyor. Şu kod derlenmez.
std::vector<double> vec({1,2});
std::array<double, 2> arr({{1,2}});
auto vecIt = --vec.end(); // OK
auto arrIt = --arr.end(); // error: lvalue required as decrement operand
Mecburen şöyle yaparız.
auto it = std::prev(arr.end());

Hiç yorum yok:

Yorum Gönder