【发布时间】:2016-10-04 13:42:49
【问题描述】:
我有一个这样的 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]
第一个基于 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 以避免生成副本?
【问题讨论】:
-
有什么具体问题吗?
-
我不认为有一种方法可以使用自定义迭代器来做到这一点而不会过度设计。
-
我看不出自定义迭代器如何使您的简单 for 循环更“高效”(尽管您可以使用一些
.reserves)en.wikipedia.org/wiki/KISS_principle -
除了使用
reserve()之外,我怀疑你能得到比这更有效的方法。 -
@LightnessRacesinOrbit:“简化,然后添加亮度”不是更适合您吗:-)
标签: c++ object-slicing