所以,假设我有这个:
...
struct circle {
int radius;
char color;
}
vector<circle> circles;
...
vector<int> sizes;
for (int i = 0; i < circles.size(); i++) {
sizes[i] = circles[i].radius;
}
...
有没有办法让“尺寸”自动接收所有“半径”而没有“for”例程?
提前致谢。
答案 0 :(得分:5)
使用std::transform
:
std::transform(
std::begin(circles), std::end(circles), std::back_inserter(sizes),
[](const circle &c) {return c.radius;}
);
答案 1 :(得分:1)
无法获得矢量内容的“切片”。
有些算法可以创建结果,因此for循环不会处于打开状态,但它仍然会在幕后发生。
答案 2 :(得分:1)
如果你想要另一种替代chris'变换,你可以使用for_each
。以下示例不使用lambda表达式(C ++ 11),这与chris'example。
#include <stdio.h>
#include <vector>
#include <algorithm>
typedef struct{
int radius;
char color;
} circle;
std::vector<int> *intvecPtr=NULL;
struct myclass {
void operator() (circle x)
{
if (intvecPtr != NULL)
intvecPtr->push_back(x.radius);
}
} myobject;
int main(void)
{
circle x;
std::vector<circle> circles;
for (int i=0; i<100; i++)
{
x.radius = 2*(i+1);
x.color = (i+1);
circles.push_back(x);
}
std::vector<int> sizes;
sizes.reserve(circles.size());
intvecPtr = &sizes;
std::for_each(circles.begin(), circles.end(), myobject);
for (int i = 0; i < sizes.size(); i++) {
printf("%d,",sizes[i]);
}
printf("\n");
}