[英]C++ vector iteration: const vs. const auto vs. no const
我有一个vector <string> v{"First sentence.", "Second sentence.", "Third sentence."};
我想在插入一个终点分隔符时连接。
我不明白这三种迭代方法之间的区别:
string build()
{
string ret;
for (string s: v) {
ret += (s + "\n");
}
return ret;
}
string build()
{
string ret;
for (const string s: v) {
ret += (s + "\n");
}
return ret;
}
string build()
{
string ret;
for (const auto &s: v) {
ret += (s + "\n");
}
return ret;
}
我应该使用或不使用什么,具体取决于什么?
auto x
。 auto &x
,可能你会修改它们。 auto const &x
。 所有函数重载都使用基于范围的循环 。 第一个重载接受std::string
类型的参数s
。 它会复制容器中的每个元素。 对s
所做s
更改不会反映到实际的容器元素中。
第二个重载按值接受std::string
类型的参数s
,但由于const
说明符而使其成为只读。 s
不能改变。
第三个重载通过引用const接受参数s
。 它使用自动说明符 ,它将s
推导为std::string
类型。 不允许更改,不制作副本。
在没有前两个的情况下你可以做到。 这是Const Correctness FAQ 。
结果没有区别。
允许您修改字符串,但您应该通过引用传递它,以便不修改副本。
不允许您修改字符串,这是为只读访问而完成的。
auto是为了方便,在这种情况下与第二种情况没有区别。 通常在范围循环中使用autos以避免长输入,例如std::vector<std::map<std::string, long>>::iterator
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.