使用 C++11 for() 循环遍历 vector<unique_ptr<mytype>>

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/20292682/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-27 23:01:32  来源:igfitidea点击:

Iterating through vector<unique_ptr<mytype>> using C++11 for() loops

c++c++11vectorunique-ptr

提问by Dimitris Sfounis

I've got the following batch of code:

我有以下一批代码:

std::vector<std::unique_ptr<AVLTree_GeeksforGeeks>> AVLArray(100000);

/* Let's add some objects in the vector */
AVLTree_GeeksforGeeks *avl = new AVLTree_GeeksforGeeks();
avl->Insert[2]; avl->Insert[5]; AVL->Insert[0];
unique_ptr<AVLTree_GeeksforGeeks> unique_p(avl);
AVLArray[0] = move(unique_p);
/* we do this for a number of other trees, let's say another 9...
...
...
Now the vector has objects up until AVLTree[9] */

/* Let's try iterating through its valid, filled positions */
for(auto i : AVLTree )
{
   cout << "Hey there!\n";    //This loop should print 10 "Hey there"s.
}

Ruh roh.Compilation error at the last part, in the for() loop.

呵呵呵。最后一部分的编译错误,在 for() 循环中。

\DataStructures2013_2014\main.cpp||In function 'int main()':|
\DataStructures2013_2014\main.cpp|158|error: use of deleted function 'std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = AVLTree_GeeksforGeeks; _Dp = std::default_delete<AVLTree_GeeksforGeeks>; std::unique_ptr<_Tp, _Dp> = std::unique_ptr<AVLTree_GeeksforGeeks>]'|
e:\codeblocks\mingw\bin\..\lib\gcc\mingw32.7.1\include\c++\bits\unique_ptr.h|256|error: declared here|
||=== Build finished: 2 errors, 0 warnings (0 minutes, 0 seconds) ===|

Any ideas on what I am doing wrong?

关于我做错了什么的任何想法?

回答by Dietmar Kühl

The loop

循环

for (auto i: AVLTree) { ... }

tries to make a copy of each element of the range in AVLTree.begin()and AVLTree.end(). Of course, std::unique_ptr<T>can't be copied: there is only one std::unique_ptr<T>to each pointer. It wouldn't really copy anything but rather stealit. That would be bad.

尝试制作AVLTree.begin()和范围内的每个元素的副本AVLTree.end()。当然std::unique_ptr<T>不能复制:std::unique_ptr<T>每个指针只有一个。它不会真正复制任何东西,而是窃取它。那会很糟糕。

You want to use references instead:

您想改用引用:

for (auto& i: AVLTree) { ... }

... or, if you don't modify them

...或者,如果您不修改它们

for (auto const& i: AVLTree) { ... }