切片C数组创建c++向量,每3个元素只保留2个元素

Slicing a C-array creating a C++ vector, keeping only 2 elements every 3

本文关键字:元素 3个 保留 2个 数组 创建 c++ 向量 切片      更新时间:2023-10-16

我有一个像这样的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;扩展这两个接口的实现可以隐藏数据在向量中的事实。