Windows Runtime Cpp 文字列操作 新しいページはコチラ

提供: yonewiki
移動: 案内, 検索
(応用:文字列配列のソート std::sortとstd::foreachの利用)
(応用:文字列配列のソート std::sortとstd::foreachの利用)
1,227行: 1,227行:
 
STL(Standard Template Liblary)で準備されているソート関数を利用する例を示します。文字列配列を扱うためのvectorテンプレートとクイックソート処理を行うstd::sortと配列を一覧するstd::foreachを使えば、WindowsCompareStringOrdinal関数の文字列比較を利用して文字列配列のソート処理ができます。
 
STL(Standard Template Liblary)で準備されているソート関数を利用する例を示します。文字列配列を扱うためのvectorテンプレートとクイックソート処理を行うstd::sortと配列を一覧するstd::foreachを使えば、WindowsCompareStringOrdinal関数の文字列比較を利用して文字列配列のソート処理ができます。
  
 +
<syntaxhighlight lang="cpp" line start="1">
 +
#include <locale.h>
 +
#include <wchar.h>
 +
#include <stdio.h>
 +
#include <vector>
 +
#include <algorithm>
 +
#include <crtdbg.h>
 +
#include <roapi.h>
 +
#include <winstring.h>
  
 +
int main()
 +
{
 +
HRESULT hr;
 +
setlocale(LC_ALL, "");
 +
 +
hr = RoInitialize(RO_INIT_TYPE::RO_INIT_MULTITHREADED);
 +
if (FAILED(hr)) {
 +
wprintf_s(L"初期化に失敗しました。\n");
 +
_CrtDbgBreak();
 +
return 0;
 +
}
 +
else {
 +
wprintf_s(L"初期化に成功しました。\n");
 +
}
 +
 +
const wchar_t *pcStrList[] = {
 +
L"04_文字列ネイティブ変数参照連動",
 +
L"09_文字列置換_置換変数指定",
 +
L"05_文字列結合",
 +
L"深田 恭子",
 +
L"小西 真奈美",
 +
L"広瀬 すず",
 +
L"広瀬 アリス",
 +
L"土屋 太鳳",
 +
nullptr
 +
};
 +
 +
std::vector<HSTRING> hStringList;
 +
for (int i = 0; pcStrList[i]; ++i)
 +
{
 +
HSTRING HSTRING_StrTemp;
 +
const wchar_t *cStr = pcStrList[i];
 +
hr = WindowsCreateString(cStr, wcslen(cStr), &HSTRING_StrTemp);
 +
if (FAILED(hr))
 +
{
 +
wprintf_s(L"文字列の生成に失敗しました\n");
 +
_CrtDbgBreak();
 +
return 0;
 +
}
 +
else {
 +
wprintf_s(L"文字列の生成に成功しました\n");
 +
}
 +
 +
hStringList.push_back(HSTRING_StrTemp);
 +
 +
hr = WindowsDeleteString(HSTRING_StrTemp);
 +
if (FAILED(hr)) {
 +
wprintf_s(L"文字列の削除に失敗しました\n");
 +
_CrtDbgBreak();
 +
}
 +
else {
 +
wprintf_s(L"文字列の削除に成功しました\n");
 +
}
 +
}
 +
 +
std::sort(
 +
hStringList.begin(),
 +
hStringList.end(),
 +
[hStringList, &pcStrList](const HSTRING a, const HSTRING b)->bool {
 +
    int r;
 +
HRESULT hr = WindowsCompareStringOrdinal(a, b, &r);
 +
wprintf_s(L"\n");
 +
wprintf_s(L"a = %s,b = %s %d(", WindowsGetStringRawBuffer(a, nullptr), WindowsGetStringRawBuffer(b, nullptr), r);
 +
if (r > 0) {
 +
wprintf_s(L">)\n");
 +
}
 +
else if (r < 0) {
 +
wprintf_s(L"<)\n");
 +
}
 +
else {
 +
wprintf_s(L"=)\n");
 +
}
 +
 +
if (FAILED(hr)) {
 +
wprintf_s(L"文字列の比較に失敗しました\n");
 +
_CrtDbgBreak();
 +
}
 +
else {
 +
//wprintf_s(L"文字列の比較に成功しました\n");
 +
}
 +
wprintf_s(L"\n");
 +
for (size_t i = 0; i < hStringList.size(); i++) {
 +
wprintf_s(L"%s,", WindowsGetStringRawBuffer(hStringList.at(i), nullptr));
 +
}
 +
wprintf_s(L"\n");
 +
 +
for (int i = 0; pcStrList[i]; i++) {
 +
wprintf_s(L"%s,", pcStrList[i]);
 +
}
 +
wprintf_s(L"\n");
 +
return r > 0;
 +
    }
 +
);
 +
 +
wprintf_s(L"\n");
 +
std::for_each(
 +
hStringList.begin(),
 +
hStringList.end(),
 +
[](HSTRING HSTRING_Str)->void{
 +
    wprintf_s(L"%s\n", WindowsGetStringRawBuffer(HSTRING_Str, nullptr));
 +
 +
    HRESULT hr = WindowsDeleteString(HSTRING_Str);
 +
    if (FAILED(hr)){
 +
    wprintf_s(L"文字列の削除に失敗しました\n");
 +
    _CrtDbgBreak();
 +
    }
 +
else {
 +
//wprintf_s(L"文字列の削除に成功しました\n");
 +
}
 +
    }
 +
);
 +
 +
 +
RoUninitialize();
 +
_wsystem(L"pause");
 +
}
 +
 +
</syntaxhighlight>
 +
 +
実行結果
 
  初期化に成功しました。
 
  初期化に成功しました。
 
  文字列の生成に成功しました
 
  文字列の生成に成功しました

2017年5月29日 (月) 00:00時点における版



個人用ツール
名前空間

変種
操作
案内
ツールボックス