C++ 在c++;?

C++ 在c++;?,c++,vector,C++,Vector,案例1: std::vectorsnap\u tickers(n\u仪器); 及 案例2: std::vectorsnap\u tickers; 捕捉器。调整大小(n_仪器); 在尝试案例2时,我得到了一个编译错误,而在案例1中,我没有得到任何构建失败。这是否与为其创建向量的对象类型有关 答复: 案例2中的resize使用复制构造函数,该构造函数已为Ticker类删除,因此失败 没有真正的区别。 案例1: std::vec(5); 分配5个int元素 案例2: std::vector<

案例1:

std::vectorsnap\u tickers(n\u仪器);
及 案例2:

std::vectorsnap\u tickers;
捕捉器。调整大小(n_仪器);

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

答复:
案例2中的resize使用复制构造函数,该构造函数已为Ticker类删除,因此失败

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

std::vec(5);
分配5个int元素

案例2:

std::vector<int> vec(5);
std::向量向量向量机;
向量调整(5);
这里,我们从int的空向量开始。 然后调用resize时,该函数将检查传递的大小是否小于实际大小(在这种情况下为0)。如果是,则分配_Newsize-size()新元素。如果否,则弹出_back(delete)size()-_Newsize元素

因此,最终调整大小的速度较慢,因为需要执行更多的机器周期(if语句、减去大小…)

如果您现在想了解更多信息,这里是vector的resize函数:

std::vector<int> vec;
vec.resize(5);
void resize(大小\u类型\u新闻大小)
{//根据需要确定新长度和填充
如果(_Newsize格塔尔());
_保留(_Newsize-size());
_试着开始吧
_未初始化的\u默认\u填充\u n(此->\u Mylast,\u Newsize-size(),
_阿尔瓦尔);
_一网打尽
_整洁的;
_重播;
_结束
此->\u Mylast+=\u Newsize-size();
}
}
正如你所看到的,它做了很多。 但最后,这只是一个关于(在大多数情况下并不重要)微秒的问题。。。

> P>根据C++标准(C++ 03),需要代码> STD::vector < /COD>连续存储所有元素,

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

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


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

答案是Nathan,我查看了引用的材料,找不到答案。@Appy这些说法之间没有太大区别。第一个函数在构造函数中定义初始大小,而第二个函数则单独调用
resize()
。实际上,很难相信你能从链接的参考文档中弄明白这一点。@πάνταῥε ῖ我试图指出同样的事实,我在这两个场景中找不到任何区别。我认为它们是一样的,问题是我在尝试案例2时遇到编译错误,而在案例1中没有遇到任何构建失败。这与为其创建向量的对象类型有关吗?@Appy确定这一点的最佳方法是将
Ticker
替换为一些琐碎的东西,如
int
,并查看它是否仍在编译(忽略除
Ticker
之外的向量的其他后续用途)。此外,在问题中包含您的错误也会有所帮助。我在尝试案例2时遇到编译错误,而在案例1中没有遇到任何构建失败。这是否与为其创建向量的对象类型有关?mh。我不知道你为什么会出错。那真是太好了。必须来自课堂记录。如果这是您的类,请查看=运算符是否重载。应该是!如果没有,在使用alogorithms时可能会引起一些问题。是的,我用删除操作重载了“=”运算符,如本回答中所述,以禁止复制:好的,我尝试创建一个类,并为其创建一个向量,然后调整其大小。我不得不移除dekonstruktor,它成功了。也许可以试试。当我删除=运算符和A(const A&other)时,它也起作用。当我尝试案例2时,我得到一个编译错误,而在案例1中,我没有得到任何构建失败。这可能与为其创建向量的对象类型有关吗?@Appy可能
vector::resize
将在扩展向量时默认构造类型为
T
的对象。如果没有默认构造函数,则很可能会出现编译错误。
std::vector<int> vec(5);
std::vector<int> vec;
vec.resize(5);
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();
            }
        }