C++ C++;-std::wstring到std::string-作为std::map中的键使用的快速脏转换

C++ C++;-std::wstring到std::string-作为std::map中的键使用的快速脏转换,c++,stdstring,C++,Stdstring,我想了解一下将std::wstring转换为std::string的最佳方法,但这是一种在std::map对象中用作键的快速而肮脏的转换 映射非常大,已经很好地集成到项目中,并且只有少数键需要进行这种转换,因此我认为将映射更改为接受std::wstring作为键的映射是浪费的 转换的输出实际上并不重要,但必须保持一致,以便每次都从映射中可靠地提取正确的值 该应用程序是仅限Windows的应用程序 是否有任何已知的过程可以可靠地为此进行粗略转换?或者最好的方法是通过通常的、适当的转换过程(如本SO

我想了解一下将
std::wstring
转换为
std::string
的最佳方法,但这是一种在
std::map
对象中用作键的快速而肮脏的转换

映射非常大,已经很好地集成到项目中,并且只有少数键需要进行这种转换,因此我认为将映射更改为接受
std::wstring
作为键的映射是浪费的

转换的输出实际上并不重要,但必须保持一致,以便每次都从映射中可靠地提取正确的值

该应用程序是仅限Windows的应用程序

是否有任何已知的过程可以可靠地为此进行粗略转换?或者最好的方法是通过通常的、适当的转换过程(如本SO问题/答案所述:)

编辑:请记住-只要保持一致,丢失信息是可以的。i、 e.如果我输入一些日语字符,它们总是转换成相同的(可能是垃圾)
std::string
,那就好了。这永远不会用于显示,只是用作从地图中提取值的键


谢谢

如果您对内容的语义不感兴趣,而只是对要比较的内容感兴趣,我将把内部wchar[]聚合成一个大小加倍的char[],并使用它初始化字符串(通过在构造函数中指定地址/大小)

现在,
s
不可打印(它可能包含空字符),但仍然可以分配和比较

您可以返回为:

std::wstring nws((const wchar_t*)&s[0], sizeof(char)/sizeof(wchar_t)*s.size());
现在比较

std::cout << (nws==ws)

std::cout您可以将std::wstring转换为utf-8(使用WideChartMultiByte或类似于此lib:),也就是一个以null结尾的c字符串,然后从中构造std::string。这种转换是可逆的。

作为一种变体,我会选择

std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );

也许另一个答案更快(取决于字符串迭代器的实现),但对我来说,这是一种更std\stl的方法。但是是的,这将丢失一些唯一字符。

An?也许您应该将
std::wstring
转换为,并将
std::string
设置为该值。这样可以避免伪“\0”字节。为什么要使用
std::wstring
@阿恩·默茨:谢谢你给那篇文章的链接。有趣的阅读。但是要回答你的问题:在这种情况下没有选择:p这会分散OP的注意力:重点显然不是要有漂亮的打印输出,而是要检查在一个周期内没有信息丢失。根据相等性而改变的任何输出都是相同的。我做的更短更简单,不需要额外的标题。如果这是一个无序的映射,我会关心字符串中的空字节。如果哈希函数对字符串有专门化,它可能会也可能不会考虑实际的std::string大小,而是在第一个空字节处停止。是的,在进行字符串转换时,在这里或那里丢失一些字符通常不是什么大问题!;)@mrt如果你读了这个问题,它要求“快速而肮脏的转换”和“转换的输出并不重要”,只是“它必须是一致的”。此外,还有一个完整的编辑添加,它准确地描述了“只要内容一致,丢失信息是可以的”和“转换为相同的(可能是垃圾)字符串”,以及“这将永远不会用于显示”。不,不要这样做。它只适用于英语。它破坏中文、日文等文本。
std::wstring w( L"Some" );
std::string s( w.begin(), w.end() );