Независимо от формы треугольника или нет, это всегда сложность O (N ^ 3), но, конечно, с более низкой постоянной, чем полные тройные вложенные циклы.
Ознакомьтесь с System :: Runtime :: InteropServices :: Marshal :: StringToCoTaskMemUni ()
и его друзьями.
Извините, сейчас нельзя опубликовать код; У меня нет VS на этой машине, чтобы проверить его компиляцию перед публикацией.
Вот некоторые процедуры преобразования, которые я написал много лет назад для проекта c ++ / cli, они должны по-прежнему работать.
void StringToStlWString ( System::String const^ s, std::wstring& os)
{
String^ string = const_cast<String^>(s);
const wchar_t* chars = reinterpret_cast<const wchar_t*>((Marshal::StringToHGlobalUni(string)).ToPointer());
os = chars;
Marshal::FreeHGlobal(IntPtr((void*)chars));
}
System::String^ StlWStringToString (std::wstring const& os) {
String^ str = gcnew String(os.c_str());
//String^ str = gcnew String("");
return str;
}
System::String^ WPtrToString(wchar_t const* pData, int length) {
if (length == 0) {
//use null termination
length = wcslen(pData);
if (length == 0) {
System::String^ ret = "";
return ret;
}
}
System::IntPtr bfr = System::IntPtr(const_cast<wchar_t*>(pData));
System::String^ ret = System::Runtime::InteropServices::Marshal::PtrToStringUni(bfr, length);
return ret;
}
void Utf8ToStlWString(char const* pUtfString, std::wstring& stlString) {
//wchar_t* pString;
MAKE_WIDEPTR_FROMUTF8(pString, pUtfString);
stlString = pString;
}
void Utf8ToStlWStringN(char const* pUtfString, std::wstring& stlString, ULONG length) {
//wchar_t* pString;
MAKE_WIDEPTR_FROMUTF8N(pString, pUtfString, length);
stlString = pString;
}
Не катитесь самостоятельно, используйте эти удобные (и расширяемые) оболочки, предоставляемые Microsoft.
Например:
#include <msclr\marshal_cppstd.h>
System::String^ managed = "test";
std::string unmanaged = msclr::interop::marshal_as<std::string>(managed);