2011-02-04 77 views
0

我們如何將vector變量傳遞給函數?我有一個vectorchar*和一個函數,將採取char *作爲一個參數。我怎樣才能將vector變量傳遞給這個函數?如何將矢量變量傳遞給函數?

+0

第一個即std :: vactor v; – Balaji 2011-02-04 07:59:02

回答

3

如果您有一個採用char *參數的函數,那麼您只能傳遞向量中的一個char *。例如:

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); 

編輯:根據您在下面的評論,你真的想編寫一個函數,接受向量作爲參數...嘗試:

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'; 
} 

(t他嘗試/ catch塊不必圍繞單個函數調用 - 只要v.at()調用位於try塊內的某個位置或直接或間接從該塊內部調用的函數)。

+1

或`std :: for_each(v.begin(),v.end(),the_function);` – 2011-02-04 07:52:57

0

您也可以使用它的索引訪問向量元素:

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

如果你需要一個std :: vector的內容傳遞給需要一個C數組的函數,你可以採取的地址向量的第一個元素:

void someCfunc(char *); 

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

無論其 - 小心你沒有得到的C字符串約定混了這裏! A std::vector不會在字符串的末尾自動附加'\0';你必須手動完成。如果它只是一個字節緩衝區,則需要單獨傳遞向量大小。如果你將數據接收回矢量中,C函數不能自己擴展矢量,所以你應該事先確保矢量足夠大。

還要注意,這僅適用於std::vector而不適用於其他STL容器。