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

Is there a way to create a fancy iterator & corresponding new array such that a condition is checked on index value for each index?

本文关键字:数组 检查 索引 条件 新数组 索引值 创建 一个 有没有 迭代器      更新时间:2023-10-16

在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,但仅具有来自[1],a [2],..的a的值A [7]。

我之所以问这个,是因为在我处理的问题中,我有一个二维所谓的"交错网格",在一维浮点阵列中布置,我想要一个新的阵列,只有一个"内部细胞。"例如,我从一个5x6交错的网格开始。它由30个浮子的浮子A [30]阵列表示。我可以想象,这是一个2维网格,具有x坐标x = o,1,2,3,4和y坐标y = 0,1,1,2,3,4,5。我可以通过(算术(公式x 5*y访问其值,即

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

但是,现在,我想要一个新的"内部单元格"阵列,这些阵列排除了沿4个"墙壁"的网格点。所以0&lt;x'&lt;4和0

有关如何实施此功能的建议和讨论,利用良好的C 11/14实践以及精美的迭代器,函数以及有关如何通过C 11/14的新功能解决此类问题的一般建议,会帮助我。

在stackoverflow上发布此处的帮助是因为,相信我,我在Google上搜索了许多搜索词排列,以了解我最初提出的问题,但是建议** std::transform **和** std::copy_if **(感谢@jwimberley,但他/她删除了他/她的原始答案,但std::copy_if帮助了很多(极大地帮助了搜索的内容(使用std::copy_if可能不够"广告"(。

那些Google搜索使我找到了@mikhail的答案,这正是我需要的一个数组的子集来制作一个新数组。参见如何从传递到某些STL算法的谓词获得元素索引?

给定这些阵列/向量(我要填充"样板",测试值:

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 19
20 21 22 23 24
25 26 27 28 29
30 31 32 33 34
35 36 37 38 39

->

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