c++ - std::wstring到std::string的快速转换,用作std::map中的键
C++ - std::wstring to std::string - quick and dirty conversion for use as key in std::map
我正在寻找一些关于将std::wstring
转换为std::string
的最佳方法的建议-但是在std::map<std::string, int>
对象中用作键的快速和肮脏的转换。
地图是相当大的,并且已经很好地集成到项目中,并且只有少数几个键需要这种转换,所以我认为将地图更改为接受std::wstring
作为键是浪费的。
转换的输出实际上并不重要,但它必须是一致的,以便每次都可靠地从映射中提取正确的值。
该应用程序是Windows专用的应用程序。
是否有任何已知的过程来做一个粗略的转换可靠的这个目的?或者最好的方法是通过通常的,适当的,转换过程(如在这个问题/答案中所述:如何将wstring转换为字符串?)?
编辑:请记住-丢失信息是好的只要的事情是一致的。例如,如果我加入一些日文字符,并且它们始终转换为相同的(可能是垃圾的)std::string
,那就没问题了。这将永远不会显示,只用作从映射中提取值的键。
谢谢!
作为一种变体,我会选择
std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );
也许另一个答案更快(取决于字符串迭代器的实现),但对我来说,这是一种更std/stl的方式。是的,这会失去一些独特的字符
如果您对内容的语义不感兴趣,而只是对要比较的内容感兴趣,我将把内部的wchar[]凝聚成一个双倍大小的char[],并使用它来初始化字符串(通过在构造函数中指定地址/大小)
std::wstring ws(L"ABCD€FG");
std::string s((const char*)&ws[0], sizeof(wchar_t)/sizeof(char)*ws.size());
现在s
是不可打印的(它可能包含空字符),但仍然可分配和比较。
你可以回到:
std::wstring nws((const wchar_t*)&s[0], sizeof(char)/sizeof(wchar_t)*s.size());
现在比较
std::cout << (nws==ws)
应该打印1
。
然而,请注意,这样在映射(operator<
的结果)中的顺序是…模糊是因为0的存在,而不反映任何文本语义。然而,搜索仍然有效,因为-无论多么模糊-它仍然是一个"顺序"。
您可以将std::wstring转换为utf-8(使用WideCharToMultiByte或类似于此库:http://utfcpp.sourceforge.net/的东西),即一个终止null的c-string,然后从中构造std::string。这个转换是可逆的
- 附加使用 Struct 作为"multikey"并将 std::vector 用作映射值的映射
- 当用作非类型模板参数时,是否可以自动派生 std::array 的大小
- 如何使用 std::multimap 将整数键映射到两个用作多维数组坐标的整数值(对于井字)?
- std :: vector用作堆栈和std :: stack之间是否存在任何复杂性差异
- 如何将 std::function 的零个或多个参数用作 std::map 中的值
- 是否可以将std :: byte用作枚举类的基础类型
- 推导 std::function 结果类型并将其用作参数
- 为什么要使用std ::少用作默认函数来比较std :: map and std :: set中的键
- 当 std::initializer_list 用作赋值参数时,为什么它不是引用类型?
- 使用std::shared_ptr将成员函数用作自定义deleter时出现问题
- std::map{'0',0}对在char'0'用作查找
- 右值模板参数隐式用作左值,并且 std::转发工作
- 用作 std::multimap 擦除范围的第一个和最后一个的递增迭代器
- 哪些 std 类型在移动构造函数中用作 arg 后保证为空/空
- std::string::find()无法将std::string用作参数
- 如何将std::log用作函数
- 如何将isnan用作std::find_if(c++11)的谓词函数
- 传递opencv inputarray并将其用作std::vector
- std::condition_variables可以用作计数信号量吗?
- 当指针用作指向std::unordered_map中的某个内容的关键点时,出现分段错误