1

私は次のようなクラス/構造を持っています:

struct MyStruct {
  std::string member_one;
  std::string member_two;
};

メンバーをカスタム値に設定して、MyStructあるstd::vector<MyStruct>長さののベクトルを作成します。N

std::vector<MyStruct> my_struct_vect(10);
// initialize class instances

memberOneここで、最初のメンバーを新しいベクターに抽出したいと思います。私は次のように行うことができます:

std::vector<std::string> member_one_vect(my_struct_vect.size());
for (size_t i = 0; i < my_struct_vect.size(); ++i) {
  member_one_vect[i] = my_struct_vect[i].member_one;
}

私の質問は、カスタム ループを毎回記述することなく、これを行うためのより迅速でエレガントでクリーンな方法はありますか? たとえば Python では、内包表記を使用してこれを非常に簡単に行うことができます。私は C++ で同様のことを期待していませんが、それでもこれを単純化する方法があるかどうか疑問に思っています。

アップデート

std::transformとの使用に関する素晴らしい回答に感謝しboost::adaptors::transformedます。これらは非常に便利ですが、コンパクトにするために、C++11 で導入されたラムダ関数に依存していることに注意してください (ラムダ関数なしで使用することは可能ですが、これには別のヘルパー関数を定義する必要があります)。

おまけとして、これを C++03 でコンパクトに行う方法はありますか?

4

2 に答える 2

5

使用できますstd::transform

#include <algorithm> // Necessary for std::transform()

// ...

std::vector<std::string> member_one_vect(my_struct_vect.size());

std::transform(
    my_struct_vect.begin(), my_struct_vect.end(), member_one_vect.begin(),
    [] (MyStruct const& ms)
{
    return ms.member_one;
});

完全なコードは次のようになります。

#include <vector>
#include <string>
#include <algorithm>

struct MyStruct {
  std::string member_one;
  std::string member_two;
};

int main()
{
    std::vector<MyStruct> my_struct_vect(10);

    // Initialize my_struct_vect...

    std::vector<std::string> member_one_vect(my_struct_vect.size());

    std::transform(
        my_struct_vect.begin(), my_struct_vect.end(), member_one_vect.begin(),
        [] (MyStruct const& ms)
    {
        return ms.member_one;
    });

    // Do something with member_one_vect...
}

これが実際のです。

于 2013-06-17T10:09:19.200 に答える
3

アルゴリズムを使用できます。

std::vector<std::string> member_one_vect(my_struct_vect.size());
std::transform(my_struct_vect.begin(), my_struct_vect.end(),
member_one_vect.begin(),
[](const MyStruct& m) { return m.member_one; });

また、使用することができますboost::adaptors::transformed

#include <boost/range/adaptor/transformed.hpp>
#include <boost/range/algorithm/copy.hpp>

std::vector<std::string> member_one_vect(my_struct_vect.size());
std::function<std::string(const MyStruct&)> transform =
[] (const MyStruct& m) { return m.member_one; };
boost::copy(my_struct_vect | boost::adaptors::transformed(transform),
member_one_vect.begin());
于 2013-06-17T10:08:22.517 に答える