【问题标题】:What is the difference in the following two cases of vector usage in c++?c++中以下两种向量使用情况有什么区别?
【发布时间】:2016-08-31 16:15:00
【问题描述】:

案例一:

std::vector< Ticker > snap_tickers_ (n_instruments);

和 案例2:

std::vector< Ticker >snap_tickers_;
snap_tickers_.resize(n_instruments);

我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关?

回答: 在案例 2 中调整大小使用复制构造函数,该构造函数已为 Ticker 类删除,因此失败。

【问题讨论】:

  • reference material 会回答这个问题
  • 内森,我查看了引用的材料,找不到答案..
  • @Appy 这些语句之间没有太大区别。第一个定义构造函数中的初始大小,而第二个通过单独调用resize() 来实现。实际上很难相信您无法从链接的参考文档中弄清楚这一点。
  • @πάνταῥε ῖ我试图指出我在这两种情况下找不到任何区别。我认为它们是相同的,问题是我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关?
  • @Appy 确定它的最佳方法是将Ticker 替换为一些琐碎的东西,例如int,然后查看它是否仍然可以编译(忽略以后对向量的其他预期Ticker 的使用)。此外,这将有助于在问题中包含您的错误

标签: c++ vector


【解决方案1】:

没有真正的区别。 案例一:

std::vector<int> vec(5);

分配 5 个 int 元素。

案例2:

std::vector<int> vec;
vec.resize(5);

在这里,我们从一个空的整数向量开始。 然后,当您调用 resize 时,该函数会检查您传递的大小是否小于实际大小(在这种情况下为 0)。如果是,分配 _Newsize - size() 新元素。如果没有,pop_back(删除)size() - _Newsize 个元素。

所以最后,resize 会更慢,因为有更多的机器周期(if 语句,减去大小...)要做。

如果你现在想要更多,这里是矢量的调整大小函数:

void resize(size_type _Newsize)
        {   // determine new length, padding as needed
        if (_Newsize < size())
            _Pop_back_n(size() - _Newsize);
        else if (size() < _Newsize)
            {   // pad as needed
            _Alty _Alval(this->_Getal());
            _Reserve(_Newsize - size());
            _TRY_BEGIN
            _Uninitialized_default_fill_n(this->_Mylast, _Newsize - size(),
                _Alval);
            _CATCH_ALL
            _Tidy();
            _RERAISE;
            _CATCH_END
            this->_Mylast += _Newsize - size();
            }
        }

如您所见,它做了很多事情。 但最后,这只是一个关于(在大多数情况下并不重要)微秒的问题...... 所以没有真正的区别。

【讨论】:

  • 我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关?
  • mh。我不知道为什么你会得到一个错误。这真是太奇怪了。必须来自 Ticker 类。如果那是您的课程,请查看 = 运算符是否重载。它应该是!如果不是这样,在使用算法时可能会造成一些麻烦。
  • 是的,我已经用删除操作重载了 '=' 运算符,如本答案中所述以禁止复制:stackoverflow.com/a/5513928/5330679
  • 好的,我尝试创建一个类,并为其创建一个向量,然后调整它的大小。我不得不移除 dekonstruktor 并且它起作用了。也许试试看。
  • 当我删除 = 运算符和 A(const A &other) 时它也有效
【解决方案2】:

根据 C++ 标准(自 C++03 起),std::vector 需要连续存储所有元素,

[...] 这意味着不仅可以通过迭代器访问元素,还可以在指向元素的常规指针上使用偏移量。这意味着指向向量元素的指针可以传递给任何需要指向数组元素的指针的函数。

由于此限制,调整大小可能可能降低性能,因为需要将元素复制到新的预分配块。在实践中,这种开销通常只在调整现有向量的大小时才会出现,其中有很多项需要向量将所有对象复制(或移动)到新的内存位置。

在您给出的示例中,没有真正的区别,因为原始向量中没有任何项目(并且许多编译器预先分配了一块内存开始)。如果编译器进行了优化以呈现等效代码,我不会感到惊讶。

【讨论】:

  • 我在尝试案例 2 时遇到编译错误,而在案例 1 中没有任何构建失败。这是否与为其创建向量的对象类型有关?
  • @Appy 可能。 vector&lt;T&gt;::resize 在扩展向量时将默认构造 T 类型的对象。如果没有默认构造函数,你很可能会遇到编译错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-02-12
  • 1970-01-01
  • 2013-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多