gpt4 book ai didi

c++ - 如何在 vector::clear() 上保留 vector 元素的容量?

转载 作者:太空宇宙 更新时间:2023-11-04 12:41:33 25 4
gpt4 key购买 nike

当我清除 vector<string> , vector的容量被保留,但是个人的容量string vector 中的 s 不被保留。有办法实现吗?

我想不出一种直接、简单的方式来实现这一点。这是一些测试代码,演示了我正在尝试做的事情:

#include <string>
#include <iostream>
#include <sstream>
#include <vector>

using namespace std;

int main()
{
istringstream input;
input.str(
R"(2
This is the first sentence.
And this is the second sentence.
3
Short text.
Another short text.
The end!
)");

vector<string> lines;

string line; // The capacity of this string is preserved throughout.
while (getline(input, line))
{
int count = stoi(line);

lines.clear(); // This clears capacity of the string elements too!
for (int i = 0; i < count; ++i)
{
getline(input, line);
lines.push_back(line);
}

// process/print 'lines' here.
}

return 0;
}

保留 string 容量的一种方法元素将永远不会清除 vector ,并跟踪 vector 的大小手动。但这根本不干净。这个问题有一个干净的解决方案吗?

编辑:

如果我按以下方式重新排列代码,我就能够保留 vector 中字符串的容量。然而,这是非常难看的。我正在寻找一个干净的解决方案。

    ...
vector<string> lines;

string line; // The capacity of this string is preserved throughout.
while (getline(input, line))
{
int count = stoi(line);

for (int i = 0; i < count; ++i)
{
if (i < lines.size())
{
getline(input, lines[i]);
}
else
{
lines.emplace_back();
getline(input, lines.back());
}
}

// process/print 'lines' here.
// Size is 'count'.
}
...

最佳答案

How to preserve capacity of vector elements on vector::clear()?

I can't think of a way to achieve this in a straightforward, simple manner.

那是因为没有一种直接的方法可以实现您想要的。一旦你销毁了一个字符串,它的分配就消失了,并且没有保证的方法可以取回它。

您可以做的是在清除源 vector 之前将字符串移动到另一个 vector 上。清除后,您可以随意将琴弦移回原位。然而,虽然这在技术上可以满足标题中所述的要求,但我看不出这比不首先清除 vector 对您更有用。


我假设您想“保留容量”以避免为优化目的进行不必要的分配。根据行的“处理”含义,根本不将它们存储在 vector 中可能更有效,而是读取输入直到换行,处理/打印,然后读取下一行等等。这样一来,您只需分配一个字符串一次(或几次,因为该行会增长到最长的输入行)。

关于c++ - 如何在 vector::clear() 上保留 vector 元素的容量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53966769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com