将 boost::container::boost basic_string 转换为 std::string
Convert boost::container::boost basic_string to std::string
有没有简单的方法可以做到这一点?
我试过以下方法:
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);
根据 @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());
或
std::string s(my_basic_string.begin(), my_basic_string.end());
我更喜欢第二种,但两者都可以。
只需按元素复制(任何体面的标准库实现都会优化到 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"(因为它不再是 "basic" 而不是 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());
}
有没有简单的方法可以做到这一点? 我试过以下方法:
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);
根据 @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());
或
std::string s(my_basic_string.begin(), my_basic_string.end());
我更喜欢第二种,但两者都可以。
只需按元素复制(任何体面的标准库实现都会优化到 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"(因为它不再是 "basic" 而不是 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());
}