有没有办法创建一个奇特的迭代器&;相应的新数组,以便对每个索引的索引值检查条件? 在C++中,有没有一种方法可以从旧数组创建一个新数组,而旧数组只有那些满足条件的索引的值?p>

有没有办法创建一个奇特的迭代器&;相应的新数组,以便对每个索引的索引值检查条件? 在C++中,有没有一种方法可以从旧数组创建一个新数组,而旧数组只有那些满足条件的索引的值?p>,c++,arrays,c++11,iterator,slice,C++,Arrays,C++11,Iterator,Slice,例如,假设我们有 float A[10] ; 在这种情况下,指数是idx=0,1,2,3,4,5,6,7,8,9 我想在一次遍历这些索引的过程中,反复检查一个条件,比如 idx >0 && idx < 8 按您期望的方式编号,idx_new=0,1,2,3,4,5,6,7,但仅具有A[1],A[2],。。A[7] 我这样问是因为在我正在研究的问题中,我有一个二维的所谓“交错网格”,以一维浮点数组的形式排列,我想要一个只有“内部单元格”的新数组。例如,我

例如,假设我们有

float A[10] ;    
在这种情况下,指数是idx=0,1,2,3,4,5,6,7,8,9

我想在一次遍历这些索引的过程中,反复检查一个条件,比如

idx >0 && idx < 8  
按您期望的方式编号,idx_new=0,1,2,3,4,5,6,7,但仅具有A[1],A[2],。。A[7]

我这样问是因为在我正在研究的问题中,我有一个二维的所谓“交错网格”,以一维浮点数组的形式排列,我想要一个只有“内部单元格”的新数组。例如,我从一个5x6交错网格开始。它由一个由30个浮点组成的[30]数组表示。我可以想象这是一个二维网格,x坐标x=O,1,2,3,4,y坐标y=0,1,2,3,4,5。我可以通过(算术)公式x+5*y,即

A[x+5*y] ; // gets the value I want  
但是现在,我想要一个只包含“内部单元”的新数组,它不包括沿着4个“墙”的网格点
关于如何实现这一点的建议和讨论,利用良好的C++11/14实践和花哨的迭代器、函子,以及关于如何利用C++11/14的新功能解决这类问题的一般性建议,将对我有所帮助。

在stackoverflow中发布有帮助,因为,相信我,我在谷歌上搜索了许多搜索词的排列,以查找我最初提出的问题,但建议**
std::transform
**和**
std::copy_if
**(感谢@jwimberley,但他/她删除了他/她的原始答案,但
std::copy_if
帮助很大)对搜索内容有很大帮助(如果不够“宣传”,可能会使用
std::copy_)

这些谷歌搜索让我找到了@Mikhail的答案,这正是我所需要的,获取数组的子集,生成一个新数组。cf

给定这些数组/向量(我正在填写“样板”,测试值:

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);  
对于我的应用程序,从交错的网格到它的内部单元,我做了如下操作-给定

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) ;}
std::vector交错网格(5*6);//30个元素,每个元素初始化为0;
std::vector internal_cells(3*4);//12个元素,每个元素初始化为0
对于(intidx=0;idxbool{//0)&(i0)&(j)

161718
212223
26 27 28

31 32 33

您不能创建这样的命名数组,但您可以创建一个命名的std::vector,这可能是您首先应该使用的。@NeilButterworth我还要求提供一个奇特的迭代器,或者如何在一个过程中进行迭代,以“切片”对于索引满足条件的数组值。我想知道如何做到这一点,因为无论数据是由浮点数组还是std::vector表示,我仍然不知道如何制作这样一个有条件的迭代器。听说过
std::transform
nad lambdas吗?我可以看到使用它们的解决方案 two@Fureeishstd::transform我不知道,现在就查吧,谢谢!我已经在谷歌上搜索了我问的问题的各种搜索词排列,以及你对std::transform和其他人的建议,如果std::copy\u“结出果实”对于我的问题,如果不在这里询问,我就不知道如何搜索std::transform和std::copy_if;谢谢!没问题。请记住,像
std::transform
std::copy_if
这样的东西使用functor作为参数。我鼓励您也阅读关于lambdas的内容,因为它们允许创建保留代码的匿名functor在一个地方,增加可读性。
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; } );
// [ 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; } );