我有一个这样的C数组:

int X[]={0, 1, 2, 3, 4, 5, 6, 7, 8};


我需要通过切片从该数组中创建两个stl向量,可能共享最大的内存量,并减少深度复制的可能性。
第一个向量Y必须仅包含第0个元素,第一个元素必须每个元素三个元素,例如,在这种情况下,此新向量Y将包含

std::vector<int> Y; // contains: [0,1,3,4,6,7]


并且另一个向量Z必须包含原始数组中的每个第3个元素:

std::vector<int> Z; // contains [2,5,8]


基于带复制的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));
}


但是我很确定,通过自定义迭代器,该问题可以有更有效的解决方案。无论如何,在此阵列上实现遮罩视图的其他一些更快版本是否可以避免生成副本?

最佳答案

您是否可能是这样的意思:

#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++ - 切片C数组以创建C++ vector ,每3个元素仅保留2个元素,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39853927/

10-13 06:18