繁体   English   中英

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

[英]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

结果没有区别。

  1. 允许您修改字符串,但您应该通过引用传递它,以便不修改副本。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM