Как сохранить емкость векторных элементов на vector :: clear ()? - PullRequest
0 голосов
/ 29 декабря 2018

Когда я очищаю vector<string>, емкость vector сохраняется, но способности отдельных string 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<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'.
    }
    ...

1 Ответ

0 голосов
/ 29 декабря 2018

Как сохранить емкость векторных элементов на vector :: clear ()?

Я не могу придумать, как это сделать простым и понятным способом.

Это потому, что не существует простого способа достичь того, чего вы хотите.Как только вы уничтожаете строку, ее выделения исчезают, и нет гарантированного способа вернуть ее обратно.

Что вы можете сделать, это переместить строки на другой вектор перед очисткой исходного вектора.Затем после очистки вы можете переместить струны обратно на досуге.Однако, хотя это технически соответствует требованию, указанному в заголовке, я не понимаю, как это могло бы быть более полезным для вас, чем не очистка вектора в первую очередь.


Полагаю, вы хотите«сохранить пропускную способность», чтобы избежать ненужного распределения с целью оптимизации.В зависимости от того, что означает «обработка» строки, может быть более эффективно вообще не сохранять их в векторе, а вместо этого читать ввод до новой строки, обрабатывать / печатать, затем читать следующую строку и так далее.Таким образом, вы выделяете одну строку только один раз (или несколько раз, когда строка растет до самой длинной входной строки).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...