2011-02-04 2 views

答えて

3

char *引数をとる関数がある場合、char *の1つだけをベクトルに渡すことができます。

std::vector<char*> v; 
char buf[] = "hello world"; 
v.push_back(buf); 
the_function(v[0]); 

あなたは、ベクター内の各メンバーの機能を呼び出したい場合は、単にループ:

for (std::vector<char*>::iterator i = v.begin(); i != v.end(); ++i) 
    the_function(*i); 

EDIT:たとえば、以下のコメントをもとに、あなたが実際に機能を書きたいこと引数としてベクトルを受け入れ...試してみてください。

void the_function(const std::vector<char*>& v) 
{ 
    // can access v in here, e.g. to print... 
    std::cout << "[ (" << v.size() << ") "; 
    for (std::vector<char*>::iterator i = v.begin(); i != v.end(); ++i) 
     std::cout << *i << ' '; 
    std::cout << " ]"; 
} 

をあなたが呼び出したい既存の機能を持っている、とあなたはその引数リストを変更しない場合は...

void TV_ttf_add_row(const char*, const char*, const void*); 

...そして、あなたはベクトルが十分な要素を持っていることを知っていると言う:

assert(v.size() >= 3); // optional check... 
TV_ttf_add_row(v[0], v[1], v[2]); 

または

if (v.size() >= 3) 
    TV_ttf_add_row(v[0], v[1], v[2]); 

か、あなたがしたい場合は、十分ながない場合、例外がスローされますvの要素、次に

try 
{ 
    TV_ttf_add_row(v.at(0), v.at(1), v.at(2)); 
} 
catch (const std::exception& e) 
{ 
    std::cerr << "caught exception: " << e.what() << '\n'; 
} 

彼はtry/catchブロックは、単一の関数呼び出しを囲む必要はありません - ちょうどv.at()呼び出しがtryブロック内のどこかにあるか、ブロック内から直接的または間接的に呼び出される関数である限り)。あなたはまた、そのインデックスでベクトル要素にアクセスすることができます

+1

または 'std :: for_each(v.begin()、v.end()、the_function); ' –

+1

@Chris:この特定のケースでは素晴らしいですが、初心者が最初に簡単な反復を学ぶことは、一般的に実行する必要のあるタスクに幅広く適用できます。 –

+0

お返事ありがとうTony。エラー: 'std :: vector >を' const char * 'に' 1 'を' int TV_ttf_add_row(const char *、const char *、const void *) 'に変換できません' – Balaji

0

:あなたはCの配列を受け取る関数にはstd ::ベクトルの内容を渡す必要がある場合

void f(char* s) 
{ 
    // do something with s 
} 

std::vector<char*> char_vect; 
size_t len = char_vect.size(); 
for (size_t i=0; i<len; ++i) 
    f(char_vect[i]); 
0

を、あなたはのアドレスを取ることができますベクトルの最初の要素:

void someCfunc(char *); 

std::vector<char *> somevec; 
// set up the vector ... then: 
someCfunc(&somevec[0]); 

もつとも - あなたがここに混ぜC文字列規則を取得しないように注意してください! std::vectorは、文字列の末尾に'\0'を自動的に付加しません。手動で行う必要があります。単なるバッファであれば、ベクトルのサイズを別々に渡す必要があります。また、ベクトルにデータを戻している場合、C関数はベクトルを独自に拡張することはできません。したがって、ベクトルが事前に十分に大きいことを確認することはあなた次第です。

これはstd::vectorにのみ適用され、他のSTLコンテナには適用されないことにも注意してください。

関連する問題