文字列

[C++] vector<string>から特定の文字列を含む要素を検索する方法

C++でstd::vector<std::string>から特定の文字列を含む要素を検索するには、std::find_ifとラムダ式を使用する方法が一般的です。

std::find_ifは条件を満たす最初の要素を見つけるアルゴリズムで、ラムダ式内でstd::string::findを用いて特定の文字列が含まれるかを判定します。

見つかった要素のイテレータを返し、見つからない場合はvector.end()を返します。

vector<string>の基本操作

C++のvectorは、動的配列を提供するコンテナであり、string型の要素を格納することができます。

vector<string>を使用することで、文字列のリストを簡単に管理できます。

以下に、基本的な操作をいくつか紹介します。

vectorの宣言と初期化

まず、vector<string>を宣言し、初期化する方法を見てみましょう。

#include <iostream>
#include <vector>
#include <string>
int main() {
    // vector<string>の宣言
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    // 要素の表示
    for (const auto& fruit : myVector) {
        std::cout << fruit << std::endl; // 各要素を表示
    }
    return 0;
}
りんご
ばなな
みかん

このコードでは、vector<string>を宣言し、初期化しています。

forループを使用して、各要素を表示しています。

要素の追加と削除

vectorに要素を追加したり、削除したりする方法も重要です。

以下のコードでは、要素の追加と削除を示します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector; // 空のvectorを宣言
    // 要素の追加
    myVector.push_back("りんご"); // 追加
    myVector.push_back("ばなな"); // 追加
    myVector.push_back("みかん"); // 追加
    // 要素の削除
    myVector.pop_back(); // 最後の要素を削除
    // 要素の表示
    for (const auto& fruit : myVector) {
        std::cout << fruit << std::endl; // 各要素を表示
    }
    return 0;
}
りんご
ばなな

この例では、push_backメソッドを使用して要素を追加し、pop_backメソッドで最後の要素を削除しています。

要素へのアクセス

vectorの要素には、インデックスを使用してアクセスできます。

以下のコードでは、特定のインデックスの要素を表示します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    // 要素へのアクセス
    std::cout << "1番目の要素: " << myVector[0] << std::endl; // インデックス0の要素を表示
    std::cout << "2番目の要素: " << myVector[1] << std::endl; // インデックス1の要素を表示
    return 0;
}
1番目の要素: りんご
2番目の要素: ばなな

このコードでは、インデックスを使用してvectorの要素にアクセスし、表示しています。

サイズの取得

vectorのサイズを取得する方法も重要です。

以下のコードでは、sizeメソッドを使用して要素数を表示します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    // サイズの取得
    std::cout << "要素数: " << myVector.size() << std::endl; // 要素数を表示
    return 0;
}
要素数: 3

この例では、sizeメソッドを使用してvectorの要素数を取得し、表示しています。

これらの基本操作を理解することで、vector<string>を効果的に活用できるようになります。

特定の文字列を検索する方法

vector<string>内で特定の文字列を検索する方法はいくつかあります。

ここでは、基本的な検索方法と、より効率的な検索方法を紹介します。

std::findを使用した検索

C++の標準ライブラリに含まれるstd::findを使用して、特定の文字列を検索する方法です。

以下のコードでは、vector<string>内で特定の果物を検索します。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // std::findを使用するために必要
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    std::string searchItem = "ばなな"; // 検索する文字列
    // std::findを使用して検索
    auto it = std::find(myVector.begin(), myVector.end(), searchItem);
    if (it != myVector.end()) {
        std::cout << searchItem << "が見つかりました。" << std::endl; // 見つかった場合
    } else {
        std::cout << searchItem << "は見つかりませんでした。" << std::endl; // 見つからなかった場合
    }
    return 0;
}
ばななが見つかりました。

このコードでは、std::findを使用してvector内の特定の文字列を検索し、見つかったかどうかを表示しています。

ループを使用した検索

forループを使用して、vector<string>内の特定の文字列を検索する方法もあります。

以下のコードでは、手動で検索を行います。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    std::string searchItem = "みかん"; // 検索する文字列
    bool found = false; // 検索結果を格納するフラグ
    // ループを使用して検索
    for (const auto& fruit : myVector) {
        if (fruit == searchItem) {
            found = true; // 見つかった場合
            break; // ループを終了
        }
    }
    if (found) {
        std::cout << searchItem << "が見つかりました。" << std::endl; // 見つかった場合
    } else {
        std::cout << searchItem << "は見つかりませんでした。" << std::endl; // 見つからなかった場合
    }
    return 0;
}
みかんが見つかりました。

この例では、forループを使用してvector内の要素を一つずつ比較し、特定の文字列が見つかったかどうかを確認しています。

部分一致検索

特定の文字列が部分的に一致する要素を検索する場合、std::string::findメソッドを使用することができます。

以下のコードでは、部分一致を検索します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    std::string searchItem = "な"; // 部分一致を検索する文字列
    std::cout << "部分一致する要素:" << std::endl;
    // 部分一致検索
    for (const auto& fruit : myVector) {
        if (fruit.find(searchItem) != std::string::npos) {
            std::cout << fruit << std::endl; // 一致した要素を表示
        }
    }
    return 0;
}
ばなな
みかん

このコードでは、findメソッドを使用して、部分一致する要素を検索し、見つかった要素を表示しています。

これらの方法を使うことで、vector<string>内で特定の文字列を効率的に検索することができます。

検索結果の処理方法

vector<string>内で特定の文字列を検索した後、検索結果をどのように処理するかは重要です。

ここでは、検索結果を処理するいくつかの方法を紹介します。

検索結果のインデックスを取得する

検索結果が見つかった場合、そのインデックスを取得して、後続の処理に利用することができます。

以下のコードでは、std::findを使用してインデックスを取得します。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // std::findを使用するために必要
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    std::string searchItem = "ばなな"; // 検索する文字列
    // std::findを使用して検索
    auto it = std::find(myVector.begin(), myVector.end(), searchItem);
    if (it != myVector.end()) {
        int index = std::distance(myVector.begin(), it); // インデックスを取得
        std::cout << searchItem << "が見つかりました。インデックス: " << index << std::endl; // インデックスを表示
    } else {
        std::cout << searchItem << "は見つかりませんでした。" << std::endl; // 見つからなかった場合
    }
    return 0;
}
ばななが見つかりました。インデックス: 1

このコードでは、std::distanceを使用して、検索結果のインデックスを取得し、表示しています。

検索結果のカウント

複数の要素が一致する場合、検索結果の数をカウントすることもできます。

以下のコードでは、forループを使用して一致する要素の数をカウントします。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん", "ばなな"}; // 初期化
    std::string searchItem = "ばなな"; // 検索する文字列
    int count = 0; // 一致する要素のカウント
    // 一致する要素のカウント
    for (const auto& fruit : myVector) {
        if (fruit == searchItem) {
            count++; // 一致した場合、カウントを増やす
        }
    }
    std::cout << searchItem << "の数: " << count << std::endl; // 一致する要素の数を表示
    return 0;
}
ばななの数: 2

この例では、forループを使用して一致する要素の数をカウントし、表示しています。

検索結果のフィルタリング

検索結果をフィルタリングして、特定の条件に合致する要素だけを表示することもできます。

以下のコードでは、特定の文字列を含む要素をフィルタリングします。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん", "ばなな"}; // 初期化
    std::string filterItem = "な"; // フィルタ条件
    std::cout << "フィルタリング結果:" << std::endl;
    // フィルタリング
    for (const auto& fruit : myVector) {
        if (fruit.find(filterItem) != std::string::npos) {
            std::cout << fruit << std::endl; // フィルタ条件に合致する要素を表示
        }
    }
    return 0;
}
ばなな
ばなな
みかん

このコードでは、findメソッドを使用してフィルタ条件に合致する要素を表示しています。

検索結果の置換

検索結果を見つけた後、その要素を別の文字列に置換することも可能です。

以下のコードでは、見つかった要素を置換します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん"}; // 初期化
    std::string searchItem = "ばなな"; // 検索する文字列
    std::string replaceItem = "オレンジ"; // 置換する文字列
    // 置換処理
    for (auto& fruit : myVector) {
        if (fruit == searchItem) {
            fruit = replaceItem; // 一致した場合、置換
        }
    }
    // 結果の表示
    std::cout << "置換後の要素:" << std::endl;
    for (const auto& fruit : myVector) {
        std::cout << fruit << std::endl; // 各要素を表示
    }
    return 0;
}
りんご
オレンジ
みかん

この例では、検索した要素を新しい文字列に置換し、結果を表示しています。

これらの方法を使うことで、vector<string>内の検索結果を効果的に処理することができます。

応用的な検索方法

vector<string>内での検索は、基本的な方法だけでなく、より応用的な手法を用いることで、柔軟かつ効率的に行うことができます。

ここでは、いくつかの応用的な検索方法を紹介します。

正規表現を使用した検索

C++11以降、<regex>ライブラリを使用して正規表現による検索が可能です。

これにより、パターンマッチングを行うことができます。

以下のコードでは、正規表現を使用して特定のパターンに一致する要素を検索します。

#include <iostream>
#include <vector>
#include <string>
#include <regex> // 正規表現を使用するために必要
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん", "オレンジ"}; // 初期化
    std::regex pattern(".*な.*"); // "な"を含むパターン
    std::cout << "正規表現による検索結果:" << std::endl;
    // 正規表現を使用した検索
    for (const auto& fruit : myVector) {
        if (std::regex_match(fruit, pattern)) {
            std::cout << fruit << std::endl; // 一致した要素を表示
        }
    }
    return 0;
}
ばなな
みかん

このコードでは、正規表現を使用して”な”を含む要素を検索し、表示しています。

複数条件での検索

複数の条件を組み合わせて検索することも可能です。

以下のコードでは、特定の文字列が含まれるかつ、特定の文字列でない要素を検索します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん", "オレンジ", "ばなな"}; // 初期化
    std::string includeItem = "な"; // 含む条件
    std::string excludeItem = "りんご"; // 除外条件
    std::cout << "複数条件による検索結果:" << std::endl;
    // 複数条件での検索
    for (const auto& fruit : myVector) {
        if (fruit.find(includeItem) != std::string::npos && fruit != excludeItem) {
            std::cout << fruit << std::endl; // 条件に合致する要素を表示
        }
    }
    return 0;
}
ばなな
みかん
ばなな

この例では、”な”を含むが”りんご”でない要素を検索し、表示しています。

大文字小文字を無視した検索

大文字小文字を無視して検索する場合、文字列をすべて小文字または大文字に変換してから比較する方法があります。

以下のコードでは、すべて小文字に変換して検索を行います。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // std::transformを使用するために必要
// 小文字に変換する関数
std::string toLower(const std::string& str) {
    std::string lowerStr = str;
    std::transform(lowerStr.begin(), lowerStr.end(), lowerStr.begin(), ::tolower);
    return lowerStr;
}
int main() {
    std::vector<std::string> myVector = {"りんご", "バナナ", "みかん", "オレンジ"}; // 初期化
    std::string searchItem = "ばなな"; // 検索する文字列
    std::cout << "大文字小文字を無視した検索結果:" << std::endl;
    // 大文字小文字を無視して検索
    for (const auto& fruit : myVector) {
        if (toLower(fruit) == toLower(searchItem)) {
            std::cout << fruit << std::endl; // 一致した要素を表示
        }
    }
    return 0;
}
バナナ

このコードでは、toLower関数を使用して大文字小文字を無視して検索を行い、一致した要素を表示しています。

検索結果のソート

検索結果を取得した後、結果をソートすることもできます。

以下のコードでは、検索結果をソートして表示します。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // std::sortを使用するために必要
int main() {
    std::vector<std::string> myVector = {"りんご", "ばなな", "みかん", "オレンジ"}; // 初期化
    std::string searchItem = "な"; // 検索する文字列
    std::vector<std::string> results; // 検索結果を格納するベクター
    // 検索
    for (const auto& fruit : myVector) {
        if (fruit.find(searchItem) != std::string::npos) {
            results.push_back(fruit); // 一致した要素を結果に追加
        }
    }
    // 検索結果のソート
    std::sort(results.begin(), results.end());
    std::cout << "ソートされた検索結果:" << std::endl;
    for (const auto& fruit : results) {
        std::cout << fruit << std::endl; // ソートされた結果を表示
    }
    return 0;
}
ばなな
みかん

この例では、検索結果をソートしてから表示しています。

これらの応用的な検索方法を活用することで、vector<string>内のデータをより柔軟に扱うことができ、さまざまなニーズに対応することが可能になります。

実践例

ここでは、vector<string>を使用した実践的な例をいくつか紹介します。

これにより、実際のアプリケーションでの使い方を理解しやすくなります。

例1: ユーザーからの入力を受け取るプログラム

この例では、ユーザーから果物の名前を入力してもらい、その中から特定の文字列を含む果物を検索して表示します。

#include <iostream>
#include <vector>
#include <string>
int main() {
    std::vector<std::string> fruits; // 果物の名前を格納するベクター
    std::string input; // ユーザーからの入力
    std::string searchItem; // 検索する文字列
    // ユーザーからの入力を受け取る
    std::cout << "果物の名前を入力してください(終了するには'終了'と入力):" << std::endl;
    while (true) {
        std::getline(std::cin, input); // 入力を受け取る
        if (input == "終了") break; // 終了条件
        fruits.push_back(input); // ベクターに追加
    }
    // 検索する文字列を入力
    std::cout << "検索する文字列を入力してください:" << std::endl;
    std::getline(std::cin, searchItem); // 検索文字列を受け取る
    // 検索結果の表示
    std::cout << "検索結果:" << std::endl;
    for (const auto& fruit : fruits) {
        if (fruit.find(searchItem) != std::string::npos) {
            std::cout << fruit << std::endl; // 一致した要素を表示
        }
    }
    return 0;
}

このプログラムでは、ユーザーが果物の名前を入力し、特定の文字列を含む果物を検索して表示します。

例2: 辞書のような機能を持つプログラム

この例では、果物の名前とその説明をペアで格納し、特定の果物の説明を検索するプログラムを作成します。

#include <iostream>
#include <vector>
#include <string>
#include <utility> // std::pairを使用するために必要
int main() {
    std::vector<std::pair<std::string, std::string>> fruitDictionary; // 果物の名前と説明を格納するベクター
    fruitDictionary.push_back({"りんご", "赤い果物で、甘い。"});
    fruitDictionary.push_back({"ばなな", "黄色い果物で、栄養価が高い。"});
    fruitDictionary.push_back({"みかん", "オレンジ色の果物で、酸味がある。"});
    std::string searchItem; // 検索する果物の名前
    // 検索する果物の名前を入力
    std::cout << "果物の名前を入力してください:" << std::endl;
    std::getline(std::cin, searchItem); // 入力を受け取る
    // 検索結果の表示
    bool found = false; // 検索結果フラグ
    for (const auto& fruit : fruitDictionary) {
        if (fruit.first == searchItem) {
            std::cout << fruit.first << ": " << fruit.second << std::endl; // 説明を表示
            found = true; // 見つかった場合
            break;
        }
    }
    if (!found) {
        std::cout << searchItem << "は見つかりませんでした。" << std::endl; // 見つからなかった場合
    }
    return 0;
}

このプログラムでは、果物の名前とその説明をペアで格納し、ユーザーが入力した果物の説明を表示します。

例3: 重複を排除した果物リストの作成

この例では、ユーザーから果物の名前を入力してもらい、重複を排除した果物リストを作成します。

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> // std::sortとstd::uniqueを使用するために必要
int main() {
    std::vector<std::string> fruits; // 果物の名前を格納するベクター
    std::string input; // ユーザーからの入力
    // ユーザーからの入力を受け取る
    std::cout << "果物の名前を入力してください(終了するには'終了'と入力):" << std::endl;
    while (true) {
        std::getline(std::cin, input); // 入力を受け取る
        if (input == "終了") break; // 終了条件
        fruits.push_back(input); // ベクターに追加
    }
    // 重複を排除する
    std::sort(fruits.begin(), fruits.end()); // ソート
    fruits.erase(std::unique(fruits.begin(), fruits.end()), fruits.end()); // 重複を排除
    // 結果の表示
    std::cout << "重複を排除した果物リスト:" << std::endl;
    for (const auto& fruit : fruits) {
        std::cout << fruit << std::endl; // 各要素を表示
    }
    return 0;
}

このプログラムでは、ユーザーが入力した果物の名前から重複を排除し、結果を表示します。

これらの実践例を通じて、vector<string>の使い方や、実際のアプリケーションでの活用方法を理解することができます。

これにより、C++プログラミングのスキルをさらに向上させることができるでしょう。

まとめ

この記事では、C++のvector<string>を使用して特定の文字列を検索する方法や、その結果を処理する方法、さらには応用的な検索手法について詳しく解説しました。

これにより、vector<string>を活用したプログラミングの幅が広がり、さまざまなシナリオでの利用が可能になります。

今後は、実際のプロジェクトや課題において、これらの知識を活かして自分自身のプログラムを作成してみてください。

関連記事

Back to top button