使用boost :: shared_ptr <std :: list <T >>初始化boost :: shared_ptr <std :: vector <T >>

hsg*_*ltb 5 c++ boost

我想boost::shared_ptr<std::vector<std::string> > vec用构造函数初始化列表初始化一个boost::shared_ptr<std::list<std::string> > list

可能吗?

我试过这个:

Test.hpp

class Test
{
public:
    Test(boost::shared_ptr<std::list<std::string> > list);

private:
    boost::shared_ptr<std::vector<std::string> > vec;
};
Run Code Online (Sandbox Code Playgroud)

TEST.CPP

Test::Test(boost::shared_ptr<std::list<std::string> > list) : vec(list->begin(), list->end())
{
}
Run Code Online (Sandbox Code Playgroud)

部分错误消息:

Test.cpp: In constructor ‘Test::Test(boost::shared_ptr<std::list<std::basic_string<char> > >)’:
Test.cpp:6:85: error: no matching function for call to ‘boost::shared_ptr<std::vector<std::basic_string<char> > >::shared_ptr(std::list<std::basic_string<char> >::iterator, std::list<std::basic_string<char> >::iterator)’
Run Code Online (Sandbox Code Playgroud)

Hum*_*awi 9

更换:

vec(list->begin(), list->end())
Run Code Online (Sandbox Code Playgroud)

有:

vec(boost::make_shared(list->begin(), list->end()))
Run Code Online (Sandbox Code Playgroud)

您的构造函数应如下所示:

Test::Test(const boost::shared_ptr<std::list<std::string> >& list) :
    vec(boost::make_shared(list->begin(), list->end())){
}
Run Code Online (Sandbox Code Playgroud)

请注意,您正在将数据从中复制std::liststd::vector.

如果您想要更便宜的解决方案,可以使用它们 std::make_move_iterator.但是,由于您仍然使用boost智能指针,我认为您无法访问它.

编辑:

如果它不起作用试试这个:

vec(boost::make_shared<std::vector<std::string>>(list->begin(), list->end()))
Run Code Online (Sandbox Code Playgroud)

编辑2:

为了覆盖nullptr@Maxim Egorushkin提到的案例:

class Test{
public:
    Test(const boost::shared_ptr<std::list<std::string> >& list);

private:
    boost::shared_ptr<std::vector<std::string> > convert_to_vec(const boost::shared_ptr<std::list<std::string> >& lst) const;
    boost::shared_ptr<std::vector<std::string> > vec;
};

//in .cpp
Test::Test(const boost::shared_ptr<std::list<std::string> >& list):
    vec(convert_to_vec(list)){
}
boost::shared_ptr<std::vector<std::string> > Test::convert_to_vec(const boost::shared_ptr<std::list<std::string> >& lst) const{
    if(lst!=nullptr){
        return boost::make_shared<std::vector<std::string>>(list->begin(), list->end());
    }
    return nullptr;
}
Run Code Online (Sandbox Code Playgroud)

  • 我建议构造函数应该只使用`const std :: list <std :: string>&`,因为它不需要知道列表的生命周期.我理解只是回答这个问题:) (2认同)