vectorと配列 – プログラミング – Home

通知
すべてクリア

[解決済] vectorと配列


お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

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未使用です。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

標準C++の規格では保証されています。


返信引用
お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

ありがとうございます。

STLってその実装方法は標準C++では定められていない、とSTL標準講座という本にあった
ので不安だったのですが、問題ないですね。(ってこの本επιστημηさん監修だ)

MSDNにも
Tの配列として格納
とあったので大丈夫だとは思っていたんですけどね。

という事は今後、MSが「やっぱvectorは配列以外で実装しよう!」なんて事と考えたと
しても、標準C++が許さないわけですね、安心しました。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> 「やっぱvectorは配列以外で実装しよう!」

最初はあえて明示されてなかったけど、こういう人が現れる前に決めておかないと
C の関数とのインターフェイスなどで困るということになって、
とりあえず既存実装が軒並み配列しかないのうちに、後付で盛り込まれたらしい。

例えばこのあたり参照。
http://www.s34.co.jp/cpptechdoc/article/vectorastemp/


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> という事は今後、MSが「やっぱvectorは配列以外で実装しよう!」なんて事と考えたと
> しても、標準C++が許さないわけですね、

配列以外で実装してもいいんです。規格に合致さえすれば。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

stringも同様です。ただし、末尾が'\0'で終端されているかは実装次第。


返信引用
お茶
 お茶
(@お茶)
ゲスト
結合: 20年前
投稿: 42
Topic starter  

なるほど。
Banさんのリンク先を参照しました。
大丈夫の文字が心強かったです。

> 配列以外で実装してもいいんです。規格に合致さえすれば。

ここでの問題は&v[0]から&v[10]までが連続しているか、でしたのでそれは保証される、
けど実装手段は配列とはかぎらないよ、という事ですか。
実際、配列以外で実装する処理系が存在するかは疑問ですが・・・
stringの終端が\0とは限らないのは驚きました。
確かに\0で終わらなければいけない理由はないですね。
要はstring::c_str()で返される文字列さえ終端が\0であればよいのですから。

お二方とも、どうもありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました