std::vector::begin()
より前のものはC++11
std::vector::data()
はC++で11? 私はC++ 11よりも前にこれを求めている理由は、std :: vector :: begin()をポインタとして扱っていましたが、C++ 11の後ではないので、同等のポインタにキャストできません。では、C++ 11の後にdata()を代わりに使用できますか?C++ 11のstd :: vector :: data()に相当するpriorC++ 11のstd :: vector :: begin()はありますか?
答えて
いいえ、begin
はイテレータを返しますが、data
はポインタを返します。特定の実装では、これらは同じことかもしれませんが、これを考慮する必要はありません。
これに加えて、 'std :: vector'のメモリは、C++ 11よりも前に連続していることが保証されていませんでしたが、実際はそうでなければ少しばかげているでしょう。 – alcedine
@alcedine実際には、C++ 03で修正されました。それはC++ 98だけであり、以前はそれを保証していませんでした。 – NathanOliver
@alcedine、trueではありません。少なくとも2003年からのcontiguosであり、私は98年にcontiguosだったというかなり強い感情を持っています。 – SergeyA
iteratorをポインタとして使用することは、実装定義のため完全に間違っています。それでもイテレータのデータへのポインタが必要な場合は、このように、間接参照反復子のアドレスを使用する必要があります。
std::vector<int> v; v.push_back(42);
std::vector<int>::iterator it = v.begin();
int * p = &*it;
そしてもちろん、C++ 11であなたは、ベクトル要素へのポインタとして.data()
を使用することができます。
以前のC++ 11のstd :: vector :: data()は、C++ 11のstd :: vector :: data()に相当しますか?
あなたは同等の意味に依存します。逆参照はベクトルの最初の項目への参照を生成しますが、begin()によって返されるイテレータはdata()によって返されるポインタ型に変換可能であるとは保証されません。
これは、C++ 11より前の私は、std :: vector :: begin()をポインタとして扱っていましたが、C++ 11の後ではありません。同等のポインタにキャストします。
あなたのコードは、あなたの見方に応じて、良い(または悪い)運がありました。
C++ 11の後にdata()を使用できますか?あなたが任意の標準アルゴリズムにし、いずれかを使用することができ
data() + size()
へ
begin()
end()
にと
data()
:
ベクトルのデータをまたぐ2イテレータのペアがあります。結果は同じになります。
良いスタイルの問題としては、begin()
〜end()
を使用する必要があります(ほとんどの場合そうでしょう)。
- 1. C++ 11 std :: vector in concurrent environment
- 2. C++ 11 std相当のBoost has_dereference
- 3. C++のstd :: vectorをstd :: vector <unsigned char>に変換する
- 4. sizeof()std :: vector(C++)
- 5. C++ std :: vector problems
- 6. C++ 11 std :: array
- 7. のstd :: for_each、C++ 11
- 8. R :: vector to std :: vector
- 9. std :: vectorへのstd :: normal_distributionをstd :: vectorに格納するためにバインドする
- 10. std :: vectorのカスタムアロケータ
- 11. std :: vectorに重複があります
- 12. std :: vector resize algorithm
- 13. これは、C++ 11のstd :: vectorの内容を別のstd :: vectorの内容に移動する最も効率的な方法ですか?
- 14. NSMutableArrayからstd :: vector
- 15. std :: vector <std::string>クラッシュ
- 16. std :: vectorの問題
- 17. std :: vector resize down
- 18. boost :: interprocess - std :: string vs std :: vector
- 19. fstreamをC++のstd :: vectorにロードする
- 20. C++で参照するローカルstd :: vectorを割り当てる
- 21. std :: vectorをstd :: valarrayに代入する
- 22. C++ std :: vector emplace vs insert
- 23. C++ 11 std :: reverse()のコンビニエンスラッパー
- 24. std :: vector <T> :: iteratorのブーストに相当するものは何ですか?
- 25. C++ char * + std :: vector memory leak
- 26. std :: vector :: resizeとstd :: vector :: push_backで償却する
- 27. std :: vector <std :: vector <int>> push_backによりヒープバッファオーバーフローが発生する
- 28. libstdC++のstd :: vector <bool> :: dataは何をしますか?
- 29. Android NDK:エラー:-std = C++ 11または-std = gnu ++ 11コンパイラオプションで有効にする必要があります
- 30. std :: vector用のテンプレートイテレータ
std :: vector :: begin()は決してポインタではありませんでした。 –
'std :: vector :: begin()'をポインタとして扱っていたのであれば、特定の実装の 'std :: vector :: iterator'sの表現をポインタとして使用していました。それは決してそのようなことが保証されていませんでした。 – molbdnilo
ベクターデータへのポインタを取得するために '&(* std :: vector :: begin())'を使用していますか? – NathanOliver