c++中以下两种vector用法的区别是什么?
What is the difference in the following two cases of vector usage in c++?
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将所有对象复制(或移动)到一个新的内存位置。
在您给出的示例中,没有真正的区别,因为原始向量中没有项(并且许多编译器在开始时预先分配了一块内存)。如果编译器做了一个优化来呈现等价的代码,我不会感到惊讶。相关文章:
- 为不同配置设置MSVC_RUNTIME_LIBRARY的正确方法是什么
- C++避免重复声明的语法是什么
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 实现无开销push_back的最佳方法是什么
- C++从另一个类访问公共静态向量的正确方法是什么
- "throw expression code" 1e7 >返回 d 是什么?投掷标准::overflow_error( "too big" ) : d;意味 着?
- C++中名称篡改的目的是什么
- 在 c++ 中拥有一组结构的正确方法是什么?
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 是什么阻止DOMTimerCoordinator::NextID进入无休止的循环
- 派生类销毁的最佳实践是什么
- 这个语法std::class<>{}(arg1, arg2) 在C++中是什么意思?
- 通过JNI传递数据数组的最快方法是什么
- "using namespace std;"在C++的作用是什么?
- C++和Python之间平等含义的区别的根源是什么?
- 尾随空格是什么意思,它和空白有什么区别?
- 调试构建和发布构建、区别和用途是什么意思
- "Thing thing;"和"Thing thing = Thing();"有什么区别,什么时候应该使用一个而不是另一个?
- char和CString的区别和关系是什么?
- 那么,是什么区别了template(c.end(),_1)和template_back(_1)呢