我制作了一个字符串向量
vector<string> actor_;
然后使用push_back在其中添加元素。
我现在想要显示所有这些,我需要根据向量中的元素数运行循环。为此,我需要运行以下循环:
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
答案 0 :(得分:8)
size
是会员功能;你的意思是:
for (unsigned int i = 0; i < actor_.size(); i++) { }
(使用std::size_t
代替unsigned int
也是个好主意)
答案 1 :(得分:2)
您可能需要考虑使用迭代器而不是依赖operator []来访问元素(正如您使用积分循环计数器和size()所暗示的那样)。这样,您可以根据需要更改容器类型,而无需修改访问代码。
答案 2 :(得分: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
再次,i
是int
(因为0
是int
),这意味着我们还没有解决问题。迭代器加上auto
会产生合理的结果:
for (auto it = actor_.begin(); it != actor_.end(); ++it) {}
另一种选择是使用std::for_each
和lambda。 STL语法几乎总是优先于索引上的迭代器。
哦,GMan指出C ++ 0x使基于范围的for
循环变得更容易:
for (auto& a : actor_) {}