2015-12-02 68 views
1

考慮下面的例子:升壓矢量序列追加問題

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/serialization.hpp> 


#include <iostream> 
#include <sstream> 

using namespace boost; 
using namespace std; 


int main() 
{ 
    std::ostringstream oss; 
    boost::archive::text_oarchive oa(oss); 



    vector<int> src1 = {1}, src2 = {2}; 

    vector<int> dst; 

    oa << src1; 
    oa << src2; 

    string serialized = oss.str(); 
    std::istringstream iss(serialized); 
    boost::archive::text_iarchive ia(iss); 


    ia >> dst; 

    cout << "size=" << dst.size() << endl; 

    ia >> dst; 
    cout << "size=" << dst.size() << endl; 
} 

輸出:
尺寸= 1
大小= 1把

一切都很好。然而,如果改變矢量<INT>到矢量<串>:

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/string.hpp> 
#include <boost/serialization/vector.hpp> 
#include <boost/serialization/serialization.hpp> 


#include <iostream> 
#include <sstream> 

using namespace boost; 
using namespace std; 


int main() 
{ 
    std::ostringstream oss; 
    boost::archive::text_oarchive oa(oss); 


    vector<string> src1 = {"hi"}, src2 = {"hi"}; 

    vector<string> dst; 


    oa << src1; 
    oa << src2; 

    string serialized = oss.str(); 
    std::istringstream iss(serialized); 
    boost::archive::text_iarchive ia(iss); 


    ia >> dst; 

    cout << "size=" << dst.size() << endl; 

    ia >> dst; 
    cout << "size=" << dst.size() << endl; 
} 

輸出:
尺寸= 1
大小= 2

結果被附加到dst的,沒有被分配。爲什麼?如何「分配語義」可以實現?

編譯器:gcc版本5.2.1 20151010(Ubuntu的5.2.1-22ubuntu2)
編譯:克++ -std = C++ 11 test2.cc -lboost_serialization

+0

在MSVC2013上按照您的預期工作。 – marom

+0

您使用的是哪個版本的BOOST? – marom

+0

boost版本1.58 – Alex

回答

1

還有就是在以下來源的代碼提升1.58。

if(detail::is_default_constructible<U>()){ 
    t.resize(count); 
    typename std::vector<U, Allocator>::iterator hint; 
    hint = t.begin(); 
    while(count-- > 0){ 
     ar >> boost::serialization::make_nvp("item", *hint++); 
    } 
} 
else{ 
    t.reserve(count); 
    while(count-- > 0){ 
     detail::stack_construct<Archive, U> u(ar, item_version); 
     ar >> boost::serialization::make_nvp("item", u.reference()); 
     t.push_back(u.reference()); 
     ar.reset_object_address(& t.back() , & u.reference()); 
    } 
} 

而且detail::is_default_constructible回報falsestd::string(因某些原因boost::has_trivial_constructor使用),併爲trueint。因此,當Uint時,將調用resize,然後使用值賦值,但當Ustd::string時,將使用reserve(保留實際不調整容器大小),然後使用push_back

在第二次從檔案中讀取之前,簡單的解決方法將只是clear矢量。

ia >> dst; 

cout << "size=" << dst.size() << endl; 

dst.clear(); 
ia >> dst; 
cout << "size=" << dst.size() << endl; 
+0

是的,謝謝,我已經瀏覽了boost源並且意識到了這種行爲。但我不明白爲什麼助推器開發者會選擇這種奇怪的語義 – Alex