【问题标题】:Convert boost::container::boost basic_string to std::string将 boost::container::boost basic_string 转换为 std::string
【发布时间】:2015-09-03 09:40:17
【问题描述】:

有没有简单的方法来做到这一点? 我尝试了以下方法:

typedef allocator<char,managed_shared_memory::segment_manager>
    CharAllocator;
typedef boost::container::basic_string<char, std::char_traits<char>, CharAllocator>
    my_basic_string;

std::string s(my_basic_string);

【问题讨论】:

  • 什么是my_basic_string?如果您不指定,我们将无法回答。我可以假设 boost::container::basic_string&lt;char, std::char_traits&lt;char&gt;, boost::interprocess::allocator&lt;boost::interprocess::managed_shared_memory::segment_manager&gt; &gt; 或类似的,但如果例如char 不匹配,会有更多的转换逻辑
  • @sehe :更新以显示 my_basic_string 是什么...

标签: c++ boost stdstring boost-interprocess


【解决方案1】:

作为@T.C.已经说过,你应该使用:

std::string s(my_basic_string.data(), my_basic_string.size());

或

std::string s(my_basic_string.begin(), my_basic_string.end());

我更喜欢第二种,但两者都可以。

【讨论】:

    【解决方案2】:

    只需按元素复制(任何体面的标准库实现都会优化到memcpy):

    #include <boost/interprocess/managed_shared_memory.hpp>
    #include <iostream>
    
    using namespace boost::interprocess;
    typedef allocator<char, managed_shared_memory::segment_manager> CharAllocator;
    typedef boost::container::basic_string<char, std::char_traits<char>, CharAllocator> my_shared_string;
    
    std::string s(my_shared_string const& ss) {
        return std::string(ss.begin(), ss.end());
    }
    

    我将字符串称为“my_shared_string”(因为它并不比 std::string 更“基本”)。事实上,很高兴注意到这与具有自定义分配器的容器有关,尤其与 std::string 或 Boost Interprocess 无关:

    typedef std::basic_string<char, std::char_traits<char>, CharAllocator> my_shared_string;
    

    对于给定问题的行为完全相同;例如:

    typedef std::vector<char, CharAllocator> my_shared_vector;
    
    std::vector<char> v(my_shared_vector const& ss) {
        return std::vector<char>(ss.begin(), ss.end());
    }
    

    【讨论】:

      【解决方案3】:

      根据 @T.C. 的 cmets 更改

      你可以使用这个:

      std::string s(my_basic_string.c_str(), my_basic_string.size());
      

      【讨论】:

      • 假设没有嵌入空值。否则应使用双迭代器或指针长度构造函数。
      • 感谢 T.C 的 cmets。但是我不明白你的意思,你能举个简单的例子吗?
      • 如果包含在my_basic_string 中的字符串有一个嵌入的空字符——例如"abc\0def"——那么你的代码将初始化s 到"abc",因为它只在第一个空字符处停止.
      • @T.C.例如,谢谢。但是对于带有“abc\0def”的basic_string,“def”是什么意思?使用basic_string时,即my_basic_string.c_str()、my_basic_string.data()、my_basic_string.size(),都忽略def。请参考我的例子:link
      • 您在这里看到了同样的问题 - 如果您使用带有const char * 的构造函数,它将假定字符串在遇到的第一个空字符处终止。你需要pass the length explicitly。
      猜你喜欢
      • 2011-11-18
      • 2015-09-18
      • 1970-01-01
      • 2016-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多