2016-05-04 12 views
5

std::vector::begin()より前のものはC++11std::vector::data()はC++で11? 私はC++ 11よりも前にこれを求めている理由は、std :: vector :: begin()をポインタとして扱っていましたが、C++ 11の後ではないので、同等のポインタにキャストできません。では、C++ 11の後にdata()を代わりに使用できますか?C++ 11のstd :: vector :: data()に相当するpriorC++ 11のstd :: vector :: begin()はありますか?

+4

std :: vector :: begin()は決してポインタではありませんでした。 –

+2

'std :: vector :: begin()'をポインタとして扱っていたのであれば、特定の実装の 'std :: vector :: iterator'sの表現をポインタとして使用していました。それは決してそのようなことが保証されていませんでした。 – molbdnilo

+0

ベクターデータへのポインタを取得するために '&(* std :: vector :: begin())'を使用していますか? – NathanOliver

答えて

8

いいえ、beginはイテレータを返しますが、dataはポインタを返します。特定の実装では、これらは同じことかもしれませんが、これを考慮する必要はありません。

+0

これに加えて、 'std :: vector'のメモリは、C++ 11よりも前に連続していることが保証されていませんでしたが、実際はそうでなければ少しばかげているでしょう。 – alcedine

+7

@alcedine実際には、C++ 03で修正されました。それはC++ 98だけであり、以前はそれを保証していませんでした。 – NathanOliver

+2

@alcedine、trueではありません。少なくとも2003年からのcontiguosであり、私は98年にcontiguosだったというかなり強い感情を持っています。 – SergeyA

3

iteratorをポインタとして使用することは、実装定義のため完全に間違っています。それでもイテレータのデータへのポインタが必要な場合は、このように、間接参照反復子のアドレスを使用する必要があります。

std::vector<int> v; v.push_back(42); 
std::vector<int>::iterator it = v.begin(); 
int * p = &*it; 

そしてもちろん、C++ 11であなたは、ベクトル要素へのポインタとして.data()を使用することができます。

2

以前の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()を使用する必要があります(ほとんどの場合そうでしょう)。

関連する問題