vectorの最初の要素はその配列の先頭のポインタと考えて良いのでしょうか?
例えば以下のコードで、
#include <iostream>
#include <vector>
using namespace std;
void Out(int *p, size_t num)
{
for(size_t i=0; i<num; ++i) cout << p[i] << endl;
}
int main()
{
vector<int> v(10);
for(int i=0; i<10; ++i) v[i] = i;
Out(&v[0], v.size()); // これってOKなのでしょうか?
return 0;
}
一応0から9までちゃんと表示されますが、これは保証されている物なのでしょうか?
というのもPolygon等、配列へのポインタを要求する関数を使うのにvector<POINT>が
ある場合、いちいち
vector<POINT> v;
GetPoints(v); // POINTをvectorに格納
POINT *p = new POINT[v.size()];
copy(v.begin(), v.end(), p);
Polygon(hdc, p, v.size());
とかしてnew・copyするのって無駄な気がしたので・・・
環境はWinXPSP2 VC++6.0SP6 MFC未使用です。
標準C++の規格では保証されています。
ありがとうございます。
STLってその実装方法は標準C++では定められていない、とSTL標準講座という本にあった
ので不安だったのですが、問題ないですね。(ってこの本επιστημηさん監修だ)
MSDNにも
Tの配列として格納
とあったので大丈夫だとは思っていたんですけどね。
という事は今後、MSが「やっぱvectorは配列以外で実装しよう!」なんて事と考えたと
しても、標準C++が許さないわけですね、安心しました。
> 「やっぱvectorは配列以外で実装しよう!」
最初はあえて明示されてなかったけど、こういう人が現れる前に決めておかないと
C の関数とのインターフェイスなどで困るということになって、
とりあえず既存実装が軒並み配列しかないのうちに、後付で盛り込まれたらしい。
例えばこのあたり参照。
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/
> という事は今後、MSが「やっぱvectorは配列以外で実装しよう!」なんて事と考えたと
> しても、標準C++が許さないわけですね、
配列以外で実装してもいいんです。規格に合致さえすれば。
stringも同様です。ただし、末尾が'\0'で終端されているかは実装次第。
なるほど。
Banさんのリンク先を参照しました。
大丈夫の文字が心強かったです。
> 配列以外で実装してもいいんです。規格に合致さえすれば。
ここでの問題は&v[0]から&v[10]までが連続しているか、でしたのでそれは保証される、
けど実装手段は配列とはかぎらないよ、という事ですか。
実際、配列以外で実装する処理系が存在するかは疑問ですが・・・
stringの終端が\0とは限らないのは驚きました。
確かに\0で終わらなければいけない理由はないですね。
要はstring::c_str()で返される文字列さえ終端が\0であればよいのですから。
お二方とも、どうもありがとうございました。