我想在插入结束分隔符时连接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;
}
我应该使用或不使用什么,具体取决于什么?
答案 0 :(得分:2)
auto x
当您想要使用副本时。auto &x
当您想要处理原始项目时,可能会修改它们。auto const &x
当您想要使用原始项目时,不会修改它们。答案 1 :(得分:1)
您的所有function重载都使用range based loop。第一个重载按值接受类型s
的参数std::string
。它会复制容器中的每个元素。对s
所做的更改不会反映到实际的容器元素中。
第二个重载按值接受s
类型的参数std::string
,但由于const
说明符而使其为只读。 s
无法更改。
第三个重载通过引用const接受参数s
。它使用auto specifier推导s
为std::string
类型。不允许更改,不进行复制。
按原样你可以不用前两个。这是Const Correctness FAQ。
答案 2 :(得分:0)
结果没有区别。
允许您修改字符串,但您应该将其作为参考传递,以便不修改副本。
不允许您修改字符串,这是为了只读访问。
auto是为了方便,在这种情况下与第二种情况没有区别。通常在范围周期中使用autos以避免长时间键入,例如std::vector<std::map<std::string, long>>::iterator