将int的多个向量的向量转换为int的数组

时间:2013-09-06 23:55:20

标签: c++ arrays vector

我有一个相当简单/明显的迭代器解决方案,但是我想点击这个以确定是否有人想出了一个偶尔出现在这里的答案中的惊人食谱:)

情况如下:

  • 当前存储在vector<vector<int>>中的已知和可用大小的int的多个向量无法解决此问题,原因是API请求的混合和仅在运行时知道的vect数
  • 可以有任意数量的这些,但实际上它总是在少数和十几个之间(向量)
  • 顺序是不重要的,所以排序和排序技巧和优化是公平的游戏(不是在这个阶段我发现它有任何需要,但考虑到下面的奖金问题,他们可能会出现)
  • 那时的矢量是一次性的,所以移动技巧也是公平的游戏
  • 规模通常很小,但在罕见但非非法的边缘情况下,某些甚至所有这些情况可能会超过几百万英寸。
  • 内存不是什么大问题,在任何给定时间通常会有几GB的连续内存,这不是关键系统
  • 性能并不重要,这是一次飞行前检查,但由于它仍然面向用户,因此看起来不像应用程序正在挂起。对于边缘情况类型的场景,只需要几秒钟。

由于我目前绑定了两个具有严格二进制要求的API,因此这是GCC 4.1.x限制,因此绝对且令人抓狂的缺少任何C ++ 0x,但是可以使用Boost 1.44。

目前这些vect都包含唯一的索引,但是在将来生成一个删除了重复项的过滤数组(未来的使用可能涉及具有重叠索引的Feed)也可能成为一个要求,所以如果处理了这个奖励积分。

C ++ 11解决方案或任何相关的东西仍然受欢迎。我不是在找人做我的作业,无论如何我都有一个笨重而又有效的作品,我更多的是在启蒙和菜谱灵感之后,而不是任何东西。

提前致谢

1 个答案:

答案 0 :(得分:1)

这不是100%清楚你想要什么,但充分利用你所说的,我会做这样的事情:

std::vector<std::vector<int>> v; // input, assume it's already filled
std::size_t size = 0;
for (std::vector<std::vector<int>>::const_iterator i = v.begin(); i != v.end(); ++i)
{
    size += i->size();
}

boost::scoped_array<int> array;
if (size != 0)
{
    array.reset(new int[size]);
    std::size_t offset = 0;
    for (std::vector<std::vector<int>>::const_iterator i = v.begin(); i != v.end(); ++i)
    {
        std::copy_n(&(*i)[0], i->size(), array + offset);
        offset += i->size();
    }
}

// ...use array...

如果你想让array与众不同,你可以这样做:

std::sort(array.get(), array.get() + size);
std::size_t newSize = std::unique(array.get(), array.get() + size) - array.get();
// Now array is unique, assuming you only use elements [0, newSize)

可能有更有效的方法来排序和制作唯一的(可能对每个子向量进行排序,然后在将它们复制到新数组时执行合并排序样式操作(并且根本不复制现有项)),但是我在我的回答中,我的目标是简单+正确。一旦你有一个已知正确的解决方案,优化就可以在以后进行。