Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 对于容器的循环语法-是否复制?_C++ - Fatal编程技术网

C++ 对于容器的循环语法-是否复制?

C++ 对于容器的循环语法-是否复制?,c++,C++,我正在阅读有关迭代STL容器的新C++11语法的文章。 到目前为止,我遇到了以下示例: std::vector<int> plus; .... for(int l : plus) { std::cout << l; } 从语义上讲,它可以复制一个副本,尽管对于内置类型来说可能不会影响效率,事实上,使用副本可能更便宜。但是如果复制对象的成本很高,最好在循环中使用const引用 std::vector<ExpensiveToCopy> v; for (

我正在阅读有关迭代STL容器的新C++11语法的文章。 到目前为止,我遇到了以下示例:

std::vector<int> plus;
....
for(int l : plus)
{
std::cout << l;
}     

从语义上讲,它可以复制一个副本,尽管对于内置类型来说可能不会影响效率,事实上,使用副本可能更便宜。但是如果复制对象的成本很高,最好在循环中使用
const
引用

std::vector<ExpensiveToCopy> v;
for (const auto& i : v)
  std::cout << i << std::endl;
std::vector v;
用于(常数自动和i:v)

std::cout是的,如果你没有明确表示你想要一份推荐信,你会得到一份。对于内置类型,复制实际上更有效——当然,除非您需要引用的语义。

它将为向量中的每个元素调用复制构造函数。如果通过
const reference
获取它,它根本不会调用任何构造函数。如果不打算对元素进行变异,则应使用
const
。例如:

class Test
{
public:
    Test() { std::cout << "Default.\n"; }
    ~Test() { }
    Test(const Test& other) { std::cout << "Copy.\n"; }
    Test(Test&& other) { std::cout << "Move.\n"; }
};

int main()
{
    std::vector<Test> test;
    test.emplace_back(Test());
    for (const Test& t : test)
    {
    }
}
类测试
{
公众:

测试(){std::cout一般来说,对于
int
和其他小型类型,引用的效率略低于副本。但是,放入不必要的引用不会有多大区别。如果您在循环内使用
l
的值,比如说输出它,它无论如何都会被复制。如果有什么区别,第一个循环会更有效nt(如果您从不利用引用语义,那么循环2可以很容易地在其中得到优化)。
class Test
{
public:
    Test() { std::cout << "Default.\n"; }
    ~Test() { }
    Test(const Test& other) { std::cout << "Copy.\n"; }
    Test(Test&& other) { std::cout << "Move.\n"; }
};

int main()
{
    std::vector<Test> test;
    test.emplace_back(Test());
    for (const Test& t : test)
    {
    }
}