for 带有容器的循环语法 - 是创建的副本
for loop syntax with containers - Is a copy made?
我正在阅读有关迭代STL容器的新C++11语法。到目前为止,我遇到了以下示例:
std::vector<int> plus;
....
for(int l : plus)
{
std::cout << l;
}
我的问题是上面的语法是否复制了 int?如果是这样,这不是更有效吗?
for(int& l : plus)
从语义上讲,它制作了一个副本,尽管对于内置类型可能没有效率影响,但实际上使用副本甚至可能更便宜。但是,如果复制对象的成本很高,则最好在循环中使用const
引用。
std::vector<ExpensiveToCopy> v;
for (const auto& i : v)
std::cout << i << std::endl;
只有当你想改变对象时,你才应该真正使用非常量引用。
是的,如果你没有明确表示你想要一个参考,你会得到一份副本。对于内置类型,复制实际上更有效 - 当然,除非你想要引用的语义。
它将为向量中的每个元素调用复制构造函数。如果你把它按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)
{
}
}
相关文章:
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 创建提升::shared_ptr的深层副本
- Eigen - matrix.transpose 会创建矩阵的副本吗?
- 将 MatrixXd 的行传递给要修改的函数,而不在 Eigen 中创建副本
- 创建字符串流副本
- 是否可以在并行区域中为共享 2D 数组创建选定元素的线程本地副本?(共享,私有,障碍:OPenMP)
- C++ 在其自己的类中创建对象的修改副本
- std::可选参数会创建副本吗?
- 使用 lambda 表达式创建线程时,如何为每个线程提供自己的 lambda 表达式副本
- C++ 如何创建链表的副本作为类对象
- MSVC 2017 在共享库中创建模板函数的副本
- 我如何创建一个双重指针的深层副本,涉及其他类(C )
- 是 std::make_pair 在将对象添加到地图时创建副本
- 阻止用户创建班级对象的副本,但允许动态的对象有什么好处
- 取消引用指针以创建数组的副本
- 此分配是否创建副本
- NewDirectByteBuffer是否在本机代码中创建副本
- 为变量创建副本
- 常量引用和创建副本
- &*x 操作会创建副本吗?