gpt4 book ai didi

c++ - 在 STL 算法中使用结构成员

转载 作者:行者123 更新时间:2023-11-30 00:42:15 24 4
gpt4 key购买 nike

#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::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::lambda连同 boost::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; } );

(据我所知,无论如何)

关于c++ - 在 STL 算法中使用结构成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1447783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com