21

少し初歩的な質問で申し訳ありません。ベクトルとペアのベクトルがあります

typedef std::vector <int> TItems;
typedef std::vector < std::pair <int, int> > TPairs;

ペアのすべての最初のアイテムを別のベクトルに一度に変換する方法はありますか

int main ()
{
TItems items;
TPairs pairs;

pairs.push_back (std::make_pair(1,3));
pairs.push_back (std::make_pair(5,7));

std::transform( items.begin(), items.end(), items.begin(), comp ( &pairs ) );

return 0;
}

ファンクタの設計方法

class comp
{
private:
     TPairs *pairs;

public:
    comp ( TPairs  *pairs_ ) : pairs ( pairs_) { }

    unsigned int operator () ( const unsigned int index ) const
    {
        return  (*pairs)[index].second != pairs->end();  //Bad idea
    }
};

ラムダ式とループのない、よりユーザーフレンドリーな方法があるかもしれません。ご協力いただきありがとうございます。

4

6 に答える 6

22

まず、変換された値がベクトルの後ろにプッシュされるようにback_inserter、3 番目の引数としてa を使用する必要があります。transform

第二に、int のペアを取り、最初のものを返すある種のファンクターが必要です。これは次のことを行う必要があります。

int firstElement( const std::pair<int, int> &p ) {
    return p.first;
}

さて、ピースをまとめるには:

TPairs pairs;
pairs.push_back( std::make_pair( 1, 3 ) );
pairs.push_back( std::make_pair( 5, 7 ) );

TItems items;
std::transform( pairs.begin(), pairs.end(), std::back_inserter( items ),
                firstElement );

このコードの後に​​、 items1 と 5 が含まれます。

于 2012-02-01T10:31:42.987 に答える
16

C++03 については、frerich または kotlinski の回答を参照してください。

ラムダを使用した C++11 ソリューション:

std::transform(pairs.begin(), 
               pairs.end(), 
               std::back_inserter(items), 
               [](const std::pair<int, int>& p) { return p.first; });
于 2012-02-01T10:49:49.307 に答える
3

を使用してはstd::bindどうですか?

std::transform(pairs.begin(), 
               pairs.end(), 
               std::back_inserter(items), 
               std::bind(&TPairs::value_type::first, std::placeholders::_1));

( C++11 以外のコードの場合は にstd::bind置き換えます)boost::bind

于 2012-02-01T10:39:26.380 に答える
3

これはどう?

items.reserve(pairs.size());
for (size_t it = 0; it < pairs.size(); ++it) {
    items.push_back(pairs[it].first);
}

理解しやすく、デバッグしやすい。

于 2012-02-01T10:22:19.727 に答える