2

所以,假设我有这个:

...
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”例程的情况下自动接收所有“半径”?

提前致谢。

4

3 回答 3

5

使用std::transform

std::transform(
    std::begin(circles), std::end(circles), std::back_inserter(sizes),
    [](const circle &c) {return c.radius;}
);
于 2013-06-18T19:02:38.103 回答
1

没有办法对矢量内容进行“切片”。

有一些算法可以创建结果,因此 for 循环不会处于打开状态,但它仍然会在幕后发生。

于 2013-06-18T19:07:04.643 回答
1

for_each如果您想要 chris 变换的另一种替代方法,您可以使用。与 chris 的示例不同,以下示例不使用 lambda 表达式 (C++11)。

#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");

}
于 2013-06-18T19:49:33.787 回答