VC++ 6.0 OS XP
vectorでとった可変長の配列を、ポインタを引数とする関数に渡したいのですが、なに
か、いい手は、ないでしょうか?固定長の配列に置きなおすのは、無駄なような気がす
るのですが、どうでしょう?以下のソースは、コンパイルエラーがでますが、やりたい
ことのイメージは、こういうことです。(strcpyをほかに変えるのは、目的がちがって
きます)
#include stdafx.h
#include <iostream>
#include <vector>
#include <string.h>
using namespace std ;
int main(int argc, char* argv[])
{
vector <char> char_vector ;
char_vector.push_back('A') ;
char_vector.push_back('B') ;
char_vector.push_back('C') ;
char_vector.push_back('D') ;
char_vector.push_back(NULL) ;
char copy_buffer[100] ;
//コンパイルエラー、2番目の引数の形を変換できない
strcpy(copy_buffer,char_vector) ;
return 0;
}
&char_vector[0]
でどうでしょうか?
vector は、その内部でデータを連続アドレス上に保持することが保証されている。
strcpy(copy_buffer, &char_vector[0]); とすれば事足りるわけだ。
性能面を考えるなら strcpy で \0 文字を探させるのは無駄なので
提示例のごとく、必ず \0 文字が最後の要素に存在するのであれば
memcpy(copy_buffer, &char_vector[0], char_vector.size()); でよい
# size() が 100 より大きい場合の考慮が必要
vector の最割付けが起こりうる処理を行うたびに &v[0] を更新する必要があるわけで
その辺は要注意、っつことで。
blueさん、レスありがとうございました。
コンパイルもとおり、イメージどおり動きました。
ありがとうございました。
tetrapodさん、レスありがとうございます。
前回、コメを書いたときには、時間上の問題で、tetrapodさんのコメは、見えませんで
した。
なるほど、可変長は、割り当てメモリが少なくなった場合、動的にメモリ再割り当てを
おこなうわけですね。とても参考になりました。ありがとうございました。