C ++向量迭代:const与const auto对比no const

时间:2018-03-12 08:56:08

标签: c++ string vector

我想在插入结束分隔符时连接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;
}

我应该使用或不使用什么,具体取决于什么?

3 个答案:

答案 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推导sstd::string类型。不允许更改,不进行复制。

按原样你可以不用前两个。这是Const Correctness FAQ

答案 2 :(得分:0)

结果没有区别。

  1. 允许您修改字符串,但您应该将其作为参考传递,以便不修改副本。

  2. 不允许您修改字符串,这是为了只读访问。

  3. auto是为了方便,在这种情况下与第二种情况没有区别。通常在范围周期中使用autos以避免长时间键入,例如std::vector<std::map<std::string, long>>::iterator