11


1

「最後の要素へのポインタ」のきれいな構文、std :: vector?

C ++ベクトルの最後の要素への通常のポインタ(イテレータではない)を取得するためのこれよりきれいな構文があるかどうか疑問に思っています

std::vector vec;

int* ptrToLastOne = &(*(vec.end() - 1)) ;

// the other way I could see was
int* ptrToLastOne2 = &vec[ vec.size()-1 ] ;

しかし、これらはどちらも見栄えがよくありません!

4 Answer


33


int* ptrToLastOne = &vec.back(); // precondition: !vec.empty()


6


int* ptrToLast = &(vec.back()); // Assuming the vector is not empty.


4


いくつかのより多くのオプション:

int* ptrToLast = &*vec.rbegin();

or

int* ptrToLast = &*boost::prev(vec.end());


3


それほどきれいなことは何もありませんが、内部的に同じことをするテンプレート化されたヘルパー関数を書くことができます。そうすれば、少なくとも呼び出しサイトはずっときれいに見え、タイプミスによるエラーを植え付ける可能性が低くなります。

非常に類似した質問については、https://stackoverflow.com/questions/1339470/how-to-get-the-address-of-the-stdvector-buffer-start-most-elegantly/1339487#1339487 [受け入れられた回答]を参照してくださいソリューションがどのように見えるか。