有没有办法创建一个花哨的迭代器和相应的新数组,以便检查每个索引的索引值的条件?
Is there a way to create a fancy iterator & corresponding new array such that a condition is checked on index value for each index?
在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
- 试图让变量检查数组中的某些内容
- 如何在C++中检查2D数组中负值的输入验证
- 使用for循环检查数组中的重复项
- 检查TCHAR数组输入是否为带符号整数C++
- std::数组边界检查如何工作?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- C++ 检查结果数组中有多少次数字
- 检查数组中是否有字符串中的值,如果没有,则添加它
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- 如何检查一个字符是否与字符数组中的另一个字符匹配?
- 如何检查二维数组上的周围数字?
- 检查反向数组是否与原始数组相同
- 如何检查cin是否与数组中的一组数字匹配
- 如何检查数组中是否没有值
- 如何检查字节数组是protobuf序列化字节数组还是普通字节数组
- 检查彩虹数组(检查数组的反向样式是否与自身匹配)
- 使用数组检查连续性
- c++ 根据随机生成的数组检查用户输入的值
- 使用字符串数组检查用户输入