【问题标题】:C++ STL vector for existing data现有数据的 C++ STL 向量
【发布时间】:2012-10-31 09:48:40
【问题描述】:

我可以使用我预先存在的数据创建std::vector,而不是分配新内存并复制数据吗?

为了更清楚,如果我有一个内存区域(c 数组或另一个向量的一部分或其他)并且我想提供类似向量的访问,我可以创建一个向量并告诉它使用它吗内存块?

【问题讨论】:

  • 你打算如何使用那个向量?
  • 也许完全不使用vector 或类似容器会更好。为什么要将数据放入单独的容器中?
  • 知道如何使用向量很重要。例如,在 Luchian 的回答中,结果向量不会是 vector<T>,而是 vector<T,MyAllocator>。因此,如果您需要向量的原因是将其传递给某个需要 vector<T> 的函数,那么这对您没有帮助。如果您需要该向量用于其他目的,那么它可能会对您有所帮助。
  • @SteveJessop 我正在尝试创建一个行为尽可能类似于向量的二维数组类。各种方法将返回一个“行”,它实际上是内部“平面”向量的一部分。我想如果需要,我可以只返回迭代器,但返回向量对我来说似乎更合乎逻辑。

标签: c++ stl vector


【解决方案1】:

不,但是您可以编写自己的类来执行此操作。由于这是一个相当普遍的需求,如果其他人已经这样做了,我不会感到惊讶。

然而,正常的 C++ 方法是编写模板代码来操作迭代器。您可以为向量的任何部分或 C 数组的任何部分(以及许多其他部分)创建迭代器。所以为迭代器编写模板代码可能是你应该做的。

【讨论】:

  • 你能再解释一下吗?你的意思是创建一个模板类,它有一个类似于向量的接口,接受它的构造函数的迭代器并在内部使用它们?
  • 当分配器可以完成这项工作时,为什么还要尝试重新发明轮子? “新”vector 可能有 99% 的代码与 std::vector 相同。
  • @baruch:不,john 建议不要编写接受向量的函数,而应该编写接受一对迭代器的模板函数。这样,您可以将数据存储在您喜欢的任何容器(例如向量、双端队列)或普通数组中。如何有效地将普通数组转换为向量的问题将消失,因为您不再需要向量。
  • @SteveJessop 我有一个带有内部向量的类。一些方法,根据他们的输入,需要返回这个向量的一部分。如何返回开始和结束迭代器?
  • @baruch 我会从你的方法中返回一对迭代器,即std::pair<std::vector<T>::iterator, std::vector<T>::iterator>。这有点笨拙,但一些 STL 方法(例如 map::equal_range)可以做到这一点。
【解决方案2】:

由于您可以在创建vector 时使用自定义分配器,因此在技术上是可行的。

但是,我不推荐它。我只是创建一个固定大小的向量(显然你可以掌握它),然后使用std::copy。

【讨论】:

  • 如果现有数组的大小为n,并且无论出于何种原因,向量向分配器询问大小为n+1 的空间,该怎么办?我并不是说这肯定会发生,但我很确定该标准允许vector 以它喜欢的任何边距过度分配,并在其分配结束时将多余的空间用于它喜欢的任何东西。您可能会编写分配器来注意到任何不愉快的事情发生,然后恢复到像正常分配器一样的行为。
【解决方案3】:

迭代容器的算法接受一对定义输入范围的迭代器。您可以将算法与指向大容器中间的迭代器一起使用。

例子:

std::vector<int> big_vector(100000);
// initialize it
//...
std::sort(big_vector.begin()+100, big_vector.begin()+200); // sort a subrange

int big_array[100000]; //c-style array
// initialize it
//...
std::sort(std::begin(big_array)+300, std::begin(big_array)+400); // sort a subrange

【讨论】:

    猜你喜欢
    • 2018-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多