进入unique_ptr容器

时间:2014-01-04 04:14:10

标签: c++ c++11 unique-ptr

我想要做的事情与cppreference.com的unique_ptr的代码片段极为相似。该片段在下面制作。它汇编得很好。

#include <iostream>
#include <list>
#include <vector>
#include <string>
#include <iterator>

int main()
{
    std::list<std::string> s{"one", "two", "three"};

    std::vector<std::string> v1(s.begin(), s.end()); // copy

    std::vector<std::string> v2(std::make_move_iterator(s.begin()),
                                std::make_move_iterator(s.end())); // move

    std::cout << "v1 now holds: ";
    for (auto str : v1)
            std::cout << "\"" << str << "\" ";
    std::cout << "\nv2 now holds: ";
    for (auto str : v2)
            std::cout << "\"" << str << "\" ";
    std::cout << "\noriginal list now holds: ";
    for (auto str : s)
            std::cout << "\"" << str << "\" ";
    std::cout << '\n';
}

我真正想要的是将s中的字符串移动到unique_ptr 的向量中。

类似于std::vector<std::unique_ptr<std::string>> v2(&std::make_move_iterator(s.begin()), &std::make_move_iterator(s.end()));

但这当然不起作用。

我只能用这段代码来做我想做的事情:

int main()
{
    std::list<std::string> s{"one", "two", "three"};

    std::vector<std::string> v1(s.begin(), s.end()); // copy

    std::vector<std::unique_ptr<std::string>> v2;
    for(auto& o : s)
    {
        std::unique_ptr<std::string> p ( new std::string(move(o)));
        v2.push_back(move(p));
    }

    std::cout << "\nv2 now holds: ";
    for (auto& pstr : v2)
            std::cout << "\"" << *pstr << "\" ";
    std::cout << "\noriginal list now holds: ";
    for (auto str : s)
            std::cout << "\"" << str << "\" ";
    std::cout << '\n';
} 

有没有办法将资源移到一行中的unique_ptrs容器中?

1 个答案:

答案 0 :(得分:3)

如果您使用make_unique功能,可以使用Herb Sutter建议您执行以下操作:

template<typename T, typename ...Args>
std::unique_ptr<T> make_unique( Args&& ...args )
{
    return std::unique_ptr<T> ( new T( std::forward<Args>(args)... ) );
}

int main()
{
    std::list<std::string> s{"one", "two", "three"};

    std::vector<std::unique_ptr<std::string>> v2;
    std::transform(begin(s), end(s), std::back_inserter(v2),
            &make_unique<std::string, std::string&>
    );
}

我已经从Herbs页面解除了make_unique这个问题,它包含在C ++ 14中或只是使用这个版本。

http://herbsutter.com/gotw/_102/

不幸的是我们不能使用类型扣除,因此我们必须手动提供类型。