std :: vector resize算法

时间:2017-01-17 15:14:15

标签: c++ algorithm c++11

我实际上是在尝试实现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/
//

有人可以解释一下为什么resize不会像这样附加std :: string():

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

背后的算法是什么?

4 个答案:

答案 0 :(得分:8)

关键在于:

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

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

答案 1 :(得分:1)

你正在构建一个std :: vector,里面有2个项目,默认构造 参考:std::vector constructors

替换:

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

with:

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

顺便说一下,为什么要在堆上使用new分配向量? 只需将其声明为:

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

答案 2 :(得分:1)

在构造向量时,您传递了2作为参数。如果你看看那个结构,你会看到:

explicit vector(size_type _Count)

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

答案 3 :(得分:1)

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

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

然后继续调整大小和循环。这应该按照你的建议给你预期的填充。