【问题标题】:How to preserve capacity of vector elements on vector::clear()?如何在vector :: clear()上保留向量元素的容量?
【发布时间】:2018-12-29 04:45:51
【问题描述】:

当我清除 vector<string> 时,vector 的容量会被保留,但向量中单个 strings 的容量不会被保留。有没有办法做到这一点?

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

#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<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'.
    }
    ...

【问题讨论】:

  • 为什么这对你很重要?
  • 当你清除一个向量时,向量中没有字符串,所以说保留不存在的单个字符串的容量是没有意义的。
  • 字符串的析构函数不是这样做的,这就是它没有意义的原因。您可以做的是管理自己的缓冲区并使用 string_view 查看缓冲区的后备存储。
  • 您无法保留不再存在的东西。 clear() 删除向量中的所有值。那些字符串不再存在。他们不再是了。他们不再存在。他们去见他们的创造者了。他们渴望峡湾。他们是前弦。它们不再存在,因此无法保存任何东西。
  • 为了让这个“好”,我认为您将不得不将您当前的解决方案封装在一个新的 class 中以隐藏丑陋的东西。

标签: c++ vector


【解决方案1】:

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

我想不出一种直接、简单的方式来实现这一点。

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

您可以做的是在清除源向量之前将字符串移动到另一个向量上。然后在清除后,您可以在闲暇时将琴弦移回。然而,虽然这在技术上可以满足标题中所述的要求,但我不认为这对您来说比不清除矢量更有用。


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

【讨论】:

  • 感谢您的建议。不幸的是,我一次不能处理一行。处理取决于组中所有行的上下文。
  • @FrancisXavier 那么整个输入的单个字符串如何,然后可能是指向每行开头的指针向量?
  • 谢谢@eeroika。是的,这就是我最终所做的。我将整个文件放在一个字符串中,我正在使用 string_view 指向它。不过,我不确定是否需要修改内容。
猜你喜欢
  • 2013-06-21
  • 1970-01-01
  • 2019-05-23
  • 1970-01-01
  • 2021-11-24
  • 1970-01-01
  • 1970-01-01
  • 2018-10-23
相关资源
最近更新 更多