std::vector 调整大小算法

Posted

技术标签:

【中文标题】std::vector 调整大小算法【英文标题】:std::vector resize algorithm 【发布时间】:2017-01-17 15:14:15 【问题描述】:

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

背后的算法是什么?

【问题讨论】:

您在调试器中调试程序时看到了什么? 【参考方案1】:

关键在这里:

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

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

我猜你想操纵/增加容量?你需要std::vector::reserve


您应该创建一个空向量,然后使用push_backs 来查看您所期望的行为。或者只使用operator[] 而不是两个push_backs。


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

【讨论】:

非常感谢我只是不明白构造函数是如何工作的,我认为构造函数只是增加了这种情况下的容量。 @ClémentJean - 如果你想增加容量,你需要std::vector::reserve 对于栈上的创建,我只想复制std::vector的行为 @ClémentJean - 这不应该是相关的 - std::vector 的行为在两种情况下都是相同的。您通常应该在堆栈上使用它,在极少数情况下(我现在想不出),您可能需要在堆上分配它。不管怎样,我很高兴能帮上忙。【参考方案2】:

您正在构造一个包含 2 个项目的 std::vector,默认构造。 参考:std::vector constructors

替换:

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;

【讨论】:

【参考方案3】:

要获得您希望看到的结果,请尝试以下操作:

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

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

【讨论】:

【参考方案4】:

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

explicit vector(size_type _Count)

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

【讨论】:

以上是关于std::vector 调整大小算法的主要内容,如果未能解决你的问题,请参考以下文章

如何在不丢失现有数据的情况下调整 std::vector 的大小?

如何在调整大小的 std::vector 的最后一个元素之后插入?

如何调整 Eigen::MatrixXd 的 std::vector 的大小

调整 std::vector<std::unique_ptr<T>> 大小的性能

调整动态字符串数组的大小[关闭]

如何调整 std::vector<std::queue<std::unique_ptr<int>>> 的大小?