【问题标题】:array instead of vector of vector, push_back() of elements. c++数组而不是向量的向量,元素的 push_back()。 C++
【发布时间】:2014-08-11 13:35:28
【问题描述】:

我使用 vector of vector 的方法,出于性能原因想将其更改为 array。但是,如果我不知道在 while 循环期间读取了多少数据,我无法尝试理解,如何使用数组(动态)并在数组末尾推送数据。下面是sn-p。您能否解释一下如何在数组上执行它,因为 push_back() 仅适用于矢量?将不胜感激。

std::vector<vector<double>> v1;
while (1)
{
    ..../* some code, break condition aswell*/
    vector<double> tmp;
    while ( .../*new data available*/ ) 
    {
        ...
        tmp.push_back(data);
    } 
    v1.push_back(tmp);
}

【问题讨论】:

  • std::array,原生数组还是动态内存管理?如果你打算使用push_back,你应该坚持使用向量。
  • 我进行了编辑,以便我的问题明确。我想知道如何在无法使用 push_back() 的情况下使用数组
  • 简短回答:你不能。长答案:您可以通过使用动态分配的数组并根据需要调整其大小。但是,如果 std::vector 自动执行此操作,您为什么要这样做?
  • 我提出了我倾向于动态数组方向的问题,但不确定如何。我的意思是,出于性能原因。
  • 嗯,是的,但是std::vector 基本上 一个动态数组,我很困惑您希望通过手动执行std::vector 获得什么性能提升自动执行。我敢打赌,您实际上会以更差的表现告终。

标签: c++ arrays vector dynamic-arrays push-back


【解决方案1】:

std::vector&lt;T&gt;一个动态数组。什么可能会加快你的代码是这样的:

std::vector<vector<double>> v1;
while (1)
{
    ..../* some code, break condition aswell*/
    v1.push_back(vector<double>());
    while ( .../*new data available*/ ) 
    {
        ...
        v1.back().push_back(data);
    } 
}

【讨论】:

  • 谢谢,我会努力的。向量的向量呢,我看到有人认为这会降低性能。特别是当我在其他函数调用中将它用作参数(引用)时?
  • 不要相信你所读到的关于性能的一切;-)。 std::vector 实际上基本上只是一个方便的动态数组包装器,具有相似的性能特征。大多数时候,在内存管理方面,STL 容器比你更聪明:-)。你真正应该避免的是通过值而不是作为 (const) 引用传递向量。这确实会对性能产生负面影响。
  • @beginh 错了,通过引用使用时不会降低性能。使用引用在恒定时间内起作用。
  • 听起来很合理,因为我从来没有自己衡量过性能下降,我听从你的提示:-)
  • @Asfdlol 你试过 v1.push_back(vector()); 是否有效?因为我得到'非法使用这种类型作为表达式'
【解决方案2】:

如果所有内部向量的大小始终相同,您可能不需要向量的向量,但您仍然可以使用它。

效率低下的原因可能是必须维护一个连续的缓冲区并四处移动对象。如果您尝试将大量数据存储在内存中,则可以改用std::deque,尽管在您的情况下,并非所有数据都是连续的,仅在每个内部向量和另一个向量本身内。

如果您在开始执行 push_back 之前知道内部向量中的数据大小,则可以使用 reserve() 进行优化。

您的缓慢(假设有)可能是由于算法不佳造成的,如果您正在访问内存中的大量数据,则缓存未命中。后者是一个复杂的话题,但可以大大提高性能。

【讨论】:

    猜你喜欢
    • 2016-01-24
    • 1970-01-01
    • 2013-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-30
    • 2011-06-09
    • 2016-11-16
    相关资源
    最近更新 更多