基于范围的循环用于指针向量

时间:2020-07-30 06:38:39

标签: c++11

嗨,我是业余爱好者。我陷入了基于范围的循环中。

我知道该如何使用

std::vector<ExampleClass> vec;

但是我不知道这个:

std::vector<ExampleClass*> vec;

我应该使用哪一个?

1:

for (auto x : vec)

2

for (auto& x : vec)

谢谢。

1 个答案:

答案 0 :(得分:1)

这取决于。

第一个为您提供每个循环周期的实际指针的副本。 因此,

  • 指针指向ExampleClass对象所在的内存中的地址
  • 您可以通过使用*x取消引用来访问对象
  • 更改指针的指向地址不会在for循环范围之外没有任何作用

第二个为您引用,该指针存储在向量的实际元素中。 因此,

  • 您可以执行与第一个选项相同的操作
  • ,您可以让指针指向内存中的新地址,这也将在for循环范围之外生效

重要 如果使用最后一个选项,则可能会导致内存泄漏,如果没有指针指向用新创建的ExampleClass对象!

您必须删除使用创建的矢量的每个元素!

因此,最好使用unique_ptrsmart_ptr!使用智能指针将所有权和破坏语义留给它们使用。

我将使用第二个,因为它可以为您节省一个副本,但是第一个是保护程序,而指针的副本则便宜(请参阅下面Olaf的评论)。

for (auto const& x : vec);-)