有没有办法创建一个花哨的迭代器&相应的新数组,以便检查每个索引的索引值的条件?

时间:2017-04-17 18:31:04

标签: c++ arrays c++11 iterator slice

在C ++中,有没有办法从旧数组创建一个新数组,旧数组只包含满足条件索引的那些值?

例如,说我们有

float A[10] ;    

,在这种情况下,指数是idx = 0,1,2,3,4,5,6,7,8,9。

我想在这些指数的一次通过中迭代检查一个条件,比如

idx >0 && idx < 8  

所以我获得了一个新的浮点数组,比如说

float B[8]    

按照你预期的方式编号,idx_new = 0,1,2,3,4,5,6,7,但只有A [A]的值,A [2], .. A [7]。

我问这个是因为在我正在处理的问题中,我有一个二维所谓的交错网格&#34;,在一维浮点阵列中布局,我想要一个只有&#34;内部单元格的新数组。&#34;例如,我从5x6交错网格开始。它由30个浮点数的浮点A [30]数组表示。我可以想象这个A是一个二维网格,x坐标x = O,1,2,3,4和y坐标y = 0,1,2,3,4,5。我可以通过(算术)公式x + 5 * y访问它的A值,即

A[x+5*y] ; // gets the value I want  

但是现在,我想要一个只有&#34;内部细胞的新阵列&#34;不包括沿着4&#34;墙的网格点。&#34;所以0&lt; X&#39; &LT; 4和0

有关如何实现这一点的建议和讨论,利用优秀的C ++ 11/14实践和花哨的迭代器,仿函数以及如何使用C ++的新功能解决此类问题的一般建议11/14,会帮助我。

1 个答案:

答案 0 :(得分:0)

在stackoverflow中发布这里有帮助,因为相信我,我在谷歌搜索了我最初提出的问题的许多搜索词排列,但建议** std::transform **和** std::copy_if * *(感谢@jwimberley但是他/她删除了他/她的原始答案,但是std::copy_if帮助了很多)帮助了搜索的内容(使用std::copy_if isn&#t; t&#34;广告&#34;足够,可能)。

那些谷歌搜索让我得到了@Mikhail的回答,这正是我需要的,采取一个数组的子集来制作一个新数组。比照How to obtain index of element from predicate passed to some STL algorithm?

给定这些数组/向量(我填充&#34;样板&#34;,测试值:

float A[10] { 11.,22.,33.,44.,55.,66.,77.,88.,99.,100.};
float B[8] = { 0. };
std::vector<float> A_vec(A,A+10);
std::vector<float> B_vec(B,B+8);  

然后这是重要的一步:

auto iter = std::copy_if( A_vec.begin(), A_vec.end(), B_vec.begin(), 
   [&A_vec] (const float& x) -> bool { // <-- do not forget reference here
    size_t index = &x - &A_vec[0]; // simple, "textbook" manner to get the index
    std::cout << index << " ";
    bool condition = ((index >0) && (index <9));
    return condition; } );

导致B_vec

// [ 22 33 44 55 66 77 88 99 ] // success!  

对于我的应用程序,从交错网格到内部单元格,我做了这个 - 给出

std::vector<float> staggered_grid(5*6) ; // 30 elements, each initialized to 0;
std::vector<float> inner_cells(3*4  ); // 12 elements, each initialized to 0   

for (int idx=0; idx<5*6;++idx) {
     staggered_grid[idx] = ((float) idx+10.f) ;}

所以重要的一步是

auto iter2d = std::copy_if( staggered_grid.begin(), staggered_grid.end(), inner_cells.begin(), 
[&] (const float& x) -> bool {          // <- do not forget reference here
       size_t index = &x - &staggered_grid[0]; // simple, "textbook" manner to get the index
       int j = index/5;
       int i = index % 5;
       bool condition = ((i>0) && (i<5-1) && (j>0) && (j<6-1));
       return condition; } );   

所以结果是

10 11 12 13 14
15 16 17 18 19
20 21 22 23 24
25 26 27 28 29
30 31 32 33 34
35 36 37 38 39

- &GT;

16 17 18
21 22 23
26 27 28
31 32 33