2010-04-13 37 views
1

的大小我已經作出了串矢量取決於串矢量

vector<string> actor_; 

,然後使用的push_back添加元素在它運行for循環。

我現在想要顯示它們,爲此我需要根據向量中元素的數量運行循環。對於這一點,我需要運行下面的循環:

for (int i = 0; i < (int)actor_.size; i++) 
{ 
} 

但這返回以下錯誤:


error C2440: 'type cast' : cannot convert from 'unsigned int (__thiscall std::vector<_Ty>::*)(void) const' to 'int' 
1>  with 
1>  [ 
1>   _Ty=std::string 
1>  ] 
1>  There is no context in which this conversion is possible 

回答

8

size是一個成員函數;你的意思是:

for (unsigned int i = 0; i < actor_.size(); i++) { } 

(它使用的std::size_t代替unsigned int還有一個好主意)

+0

哦,我傻......其現在的工作。 問:爲什麼std :: size_t比unsigned int更好? – xbonez 2010-04-13 19:12:59

+2

@詹姆斯:爲了澄清,他從來沒有'unsigned int'開頭。 (也許我正在閱讀大量的內容。)@xbonez:'size_t'是測量東西大小的標準整數類型,可能比'unsigned'大。 'size()'返回一個'size_t',所以你應該使用'size_t'來匹配。 – GManNickG 2010-04-13 19:13:37

+1

因爲size_t將始終與size()函數的返回類型具有相同的類型,無論您正在編譯的arch/platform(x86,x86_64等)。 – 2010-04-13 19:16:39

2

你可能要考慮使用迭代器而不是依靠運營商[]進入元素(如暗示由你使用積分循環計數器和size())。這將允許您在將來更改容器類型,而無需修改您的訪問代碼。

1

正確的是:

for (std::vector<std::string>::size_type i = 0; i < actor_.size(); ++i) {} 

這是醜陋的。您可以使用typedef來簡化它。

的C++ 0x給我們auto,但很容易誤用:

for (auto i = 0; i < actor_.size() ++i) {} // WRONG 

在這裏,iint(因爲0int),這意味着我們還沒有解決的問題。迭代器加上auto產量東西合理:

for (auto it = actor_.begin(); it != actor_.end(); ++it) {} 

另一種選擇是使用std::for_each和拉姆達。 STL語法幾乎總是支持索引上的迭代器。

哦,GMAN指出的C++ 0x使這甚至基於範圍的for循環更容易:

for (auto& a : actor_) {} 
+2

如果我們在談論C++ 0x,我寧願:for(auto&s:actor_)std :: cout << s << std :: endl;'啊,這麼簡單。 – GManNickG 2010-04-13 19:46:45