切片C数组创建c++向量,每3个元素只保留2个元素
Slicing a C-array creating a C++ vector, keeping only 2 elements every 3
我有一个像这样的c数组:
int X[]={0, 1, 2, 3, 4, 5, 6, 7, 8};
我需要从这个数组中创建两个stl向量,通过切片的方式,可能共享最大的内存量,并尽可能减少深度复制。第一个向量Y必须只包含0
-th和第一个元素,每三个元素,例如,在这种情况下,这个新的向量Y
将包含
std::vector<int> Y; // contains: [0,1,3,4,6,7]
和另一个向量Z必须包含原数组中的第三个元素:
std::vector<int> Z; // contains [2,5,8]
基于带有copy的for循环的第一种解决方案如下:
vector<int> Y,Z;
for (int i=0; i<9;i+=3)
{
Y.push_back(*(X+i));
Y.push_back(*(X+i+1));
Z.push_back(*(X+2));
}
,但我很肯定,通过自定义迭代器,这个问题可以有一个更有效的解决方案。无论如何,是否有其他更快的版本在这个数组上实现mask-view以避免生成副本?
你的意思是:
#include <iostream>
#include <vector>
using namespace std;
struct MyIndexing {
int* original;
MyIndexing(int* o) : original(o) {}
int& getY(int index){ return original[0]; /* to be done... */ }
int& getZ(int index){ return original[(index+1)*3 -1]; }
};
int main() {
int X[]={0, 1, 2, 3, 4, 5, 6, 7, 8};
MyIndexing mi(X);
for (int i=0;i<3;i++){ std::cout << mi.getZ(i) << " "; }
return 0;
}
打印:
2 5 8
它不创建向量,但无论如何你的需求有点矛盾。要么避免复制,要么创造新的载体。两者都不可能。
如果你必须创建向量,你必须做一个数据的副本,因为向量数据是连续的。
如果你不需要向量,你可以创建两个接口(原谅我的c#术语,但我认为这是适用的),一个将为Y数据提供getter,一个将为X数据提供getter;扩展这两个接口的实现可以隐藏数据在向量中的事实。
相关文章:
- 给定n个元素的m个集合.在C++中找到出现在最大集合数中的元素
- 基于多个条件处理地图中的所有元素
- 如何将两个不同矢量的同一位置的两个元素组合在一起
- 在C++中,如何通过几种类型从元组中选择多个元素
- 使用堆查找第K个最大元素的时间复杂性
- 删除列表中的第n个元素
- 查找两个排序向量中共有的元素
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- C++ 如何比较n个排序的整数向量以找到互元素?
- Lower_bound不适用于具有 3 个元素的向量的最后一个元素
- 为什么 2 个相同数组的元素彼此相等
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- 在链链表中手动插入第五个元素
- 关于比较两个无序数组并删除 a[] 中可以在 b[] 中找到的元素的问题
- 如何在 c++ 中根据第二个元素按降序对列表进行排序
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 如何创建一个所有行大小不同的 2D 数组,并且用户将指定每行将有多少个元素?
- 为什么两个矢量元素的地址有这么大的差距?
- 高级选择排序 - 在一次迭代中搜索两个元素
- 如何使用 if 检查字符串数组的第一个元素第一个符号?