簡體   English   中英

在STL算法中使用結構成員

[英]Using a struct member in STL algorithms

#include <iostream>
#include <vector>
#include <iterator>

using namespace std;

struct Point
{
    int x;
    int y;
    Point(int x, int y) :
        x(x),
        y(y)
    {}
};

int main()
{
    vector<Point> points;
    points.push_back(Point(1, 2));
    points.push_back(Point(4, 6));

    vector<int> xs;

    for(vector<Point>::iterator it = points.begin();
        it != points.end();
        ++it)
    {
        xs.push_back(it->x);
    }

    copy(xs.begin(), xs.end(), ostream_iterator<int>(cout, " "));
    cout << endl;

    return 0;
}

我想知道如何使用STL算法獲得與上述for循環相同的結果? 我已經嘗試過使用for_each進行一些操作,但是無法使其正常工作。

您不會使用std::for_each ,而是使用std::for_each std::transform (將點轉換為單個數字。)

例如:

#include <algorithm> // transform resides here
#include <iostream>
#include <iterator>
#include <vector>

struct Point
{
    int x;
    int y;

    Point(int x, int y) :
    x(x),
    y(y)
    {
    }
};

int point_to_int(const Point& p)
{
    return p.x;
}

int main()
{
    std::vector<Point> points;
    points.push_back(Point(1, 2));
    points.push_back(Point(4, 6));

    std::vector<int> xs;
    std::transform(points.begin(), points.end(),
        std::back_inserter(xs), point_to_int);

    std::copy(xs.begin(), xs.end(),
        std::ostream_iterator<int>(std::cout, " "));

    std::cout << std::endl;

    return 0;
}

因為您知道將要轉換的容器的大小,所以您可能會從以下內容獲得稍微的性能改進。 我還發現它更具可讀性:

std::vector<int> xs;
xs.reserve(points.size());
std::transform(points.begin(), points.end(),
        std::back_inserter(xs), point_to_int);

並帶有boost::lambdaboost::bind

#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>

#include <boost/bind.hpp>
#include <boost/lambda/lambda.hpp>

struct Point
{
    int x;
    int y;

    Point(int x, int y) :
    x(x),
    y(y)
    {
    }
};

int main()
{
    using namespace boost;

    std::vector<Point> points;
    points.push_back(Point(1, 2));
    points.push_back(Point(4, 6));

    std::vector<int> xs;
    xs.reserve(points.size());
    std::transform(points.begin(), points.end(),
        std::back_inserter(xs), bind(&Point::x, lambda::_1));

    std::copy(xs.begin(), xs.end(),
        std::ostream_iterator<int>(std::cout, " "));

    std::cout << std::endl;

    return 0;
}

無需在其他地方指定函數。 這樣可以使代碼保持靠近調用站點的位置,並通常提高了可讀性。

在C ++ 0x中,它將簡單地是:

std::transform(points.begin(), points.end(),
    std::back_inserter(xs), [](const Point& p){ return p.x; } );

(據我所知)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM