C++ 将boost::container::boost basic_字符串转换为std::string

C++ 将boost::container::boost basic_字符串转换为std::string,c++,boost,stdstring,boost-interprocess,C++,Boost,Stdstring,Boost Interprocess,有没有一个简单的方法可以做到这一点? 我尝试了以下方法: 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(m

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

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);
typedef分配器
角色扮演者;
typedef boost::container::basic_字符串
我的基本字符串;
std::string s(我的基本字符串);

根据@T.C.的评论进行了更改

你可以使用这个:

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

正如@T.C.所说,您应该使用:

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

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

只需复制元素(任何合适的标准库实现都会将其优化为
memcpy
):

#包括
#包括
使用名称空间boost::interprocess;
typedef分配器CharAllocator;
typedef boost::container::basic_string my_shared_string;
std::string s(我的共享字符串常量&ss){
返回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::basic_string 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());
}
typedef std::vector my_shared_vector;
标准::向量v(我的共享向量常量和ss){
返回std::vector(ss.begin(),ss.end());
}

假设没有嵌入空值。否则应该使用双迭代器或指针和长度构造函数。感谢T.C的评论。但是我不明白你的意思,你能提供一个简单的例子吗?如果
my_basic\u string
中包含的字符串有一个嵌入的空字符-
“abc\0def”
,那么你的代码将初始化为
“abc”
仅因为它在第一个空字符处停止。@T.C.例如,谢谢。但是对于带有“abc\0def”的基本_字符串,“def”是什么意思?使用基本字符串时,即my_basic_string.c_str()、my_basic_string.data()、my_basic_string.size()都会忽略定义。请参考我的示例:您在这里看到了相同的问题-如果您使用构造函数获取
常量char*
,它将假定字符串在遇到的第一个空字符处终止。您需要。什么是
my\u basic\u string
?如果你不具体说明,我们无法回答这个问题。我可以假设一个
boost::container::basic_string
或类似的字符串,但如果例如
char
不匹配,则会有更多的转换logic@sehe:更新以显示我的\u基本\u字符串是什么。。。
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());
}