c++中以下两种vector用法的区别是什么?

What is the difference in the following two cases of vector usage in c++?

本文关键字:区别 是什么 用法 vector 两种 c++      更新时间:2023-10-16

case 1:

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

和案例2:

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

当我尝试案例2时,我得到一个编译错误,而在情况下,我没有得到任何构建失败。这是否与创建向量的对象类型有关?

回答:情况2中的resize使用了复制构造函数,该构造函数在Ticker类中已被删除,因此出现了失败。

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

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

分配5个int元素。

例2:

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

从一个空的整型向量开始。当您调用resize时,该函数将检查传递的大小是否小于实际大小(在这种情况下为0)。如果是,分配_Newsize - size()新元素。如果没有,pop_back (delete) 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();
            }
        }
如你所见,

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

根据c++标准(从c++ 03开始),std::vector需要连续存储所有元素,

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

由于这个限制,调整大小可能会潜在地降低性能,因为需要将元素复制到新的预分配块中。在实际操作中,这种开销通常只在调整现有vector的大小时出现,并且需要vector将所有对象复制(或移动)到一个新的内存位置。

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