繁体   English   中英

std :: vector调整大小算法

[英]std::vector resize algorithm

我实际上是在尝试实现std :: vector的简单副本。 在测试期间,通过与原始数据进行比较来查看我的数据是否一致,我注意到了一些东西。

std::vector<std::string> *v = new std::vector<std::string>(2);
std::string str1("Hello");
std::string str2("World");

v->push_back(str1);
v->push_back(str2);

v->resize(5);

for (std::vector<std::string>::const_iterator it = v->begin(); it != v->end(); it++)
{
    std::cout << "/" << (*it) << "/" << std::endl;
}

结果如下:

//
//
/Hello/
/World/
//

有人可以解释一下为什么调整大小后不附加std :: string()的原因:

/Hello/
/World/
//
//
//

背后的算法是什么?

关键在这里:

std::vector<std::string> *v = new std::vector<std::string>(2);

这将创建一个包含2个元素的向量,这些元素是默认构造的(意味着-两个空字符串)。 然后您将push_back HelloWorld 现在您有4个元素。 然后, resize( 5 )仅添加一个元素(也是默认构造的)。

我想您想操纵/增加容量? 您需要改为std::vector::reserve


您应该创建一个空向量,然后使用push_back看到预期的行为。 或者只使用operator[]而不是两个push_back


是否有充分的理由在堆上而不是在堆栈上创建向量? 您(几乎?)总是应该避免这种情况。

您正在构建一个std :: vector,其中包含2个项目,默认构造。
参考: std :: vector构造函数

更换:

std::vector<std::string> *v = new std::vector<std::string>(2);

与:

std::vector<std::string> *v = new std::vector<std::string>();

而且,顺便说一句,为什么要用new在堆上分配向量? 只需声明为:

std::vector<std::string> v;

在向量的构造中,您传递了2作为参数。 如果您查看该构造,您将看到以下内容:

explicit vector(size_type _Count)

在这里,您将创建一个带有两个默认构造字符串的向量,然后将另外两个字符串推入向量。 使用默认构造,然后使用std::vector::reserve增加vector的容量。

要获得想要的结果,请尝试以下操作:

std::vector<std::string> *v = new std::vector<std::string>({"s1","s2"});

然后进行大小调整和循环。 如您所建议的那样,这应该为您提供预期的填充。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM