Очистить std :: vector без изменения его размера - PullRequest
6 голосов
/ 13 марта 2012

Я хочу повторно использовать std::vector в цикле for.Однако мне нужно, чтобы вектор был пустым для каждого шага итерации цикла for.

Вопрос: Как быстро очистить вектор, не изменяя его емкость наиболее эффективным способом?

То, что я использовал до сих пор, это

std::vector<int> myVec;
for(int i=0; i<A_BIG_NUMBER; ++i) {
    std::vector<T>().swap(myVec);
    myVec.reserve(STANDARD_MAXIMUM);

    /// .. doing business
}

Приветствия!

Решение:

Спасибо за ответы, воткак я реализовал (проверил) это:

#include <vector>
#include <iostream>

 int main() {

    int n = 10;
    std::vector< int > myVec;
    myVec.reserve(n);
    for(int j=0; j<3; ++j) {
            myVec.clear();
            for(int i=0; i<n; ++i) {
                    myVec.push_back(i);
            }
            for(int i=0; i<myVec.size(); ++i) {
                    std::cout << i << ": " << myVec[i] << std::endl;
            }
    }

    return 0;
}

РЕДАКТИРОВАТЬ: изменен с operator[] на push_back.

Ответы [ 5 ]

9 голосов
/ 13 марта 2012

Использовать vector::clear метод.Это очистит содержимое, не уменьшая его емкость.

4 голосов
/ 13 марта 2012
myVec.clear();

Это эквивалентно myVec.erase(myVec.begin(), myVec.end()).

2 голосов
/ 13 марта 2012

используйте метод очистки, как показано ниже:

std::vector<int> myVec;
    for(int i=0; i<A_BIG_NUMBER; ++i) 
    {
        std::vector<T>().swap(myVec);
        myVec.reserve(STANDARD_MAXIMUM);

        /// .. doing business
    myVec.clear();
    }
0 голосов
/ 13 марта 2012

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

myVec.assign( myVec.size(), 0 );
0 голосов
/ 13 марта 2012

Ответ на основе решения OP:
Обычный подход для контейнеров - начинать с пустого контейнера и заполнять его по мере необходимости, за исключением исключения для std :: vector, где вы можете зарезервировать пространство, даже если в нем еще нет объектов.контейнер.
Если вы хотите другой подход, где «пустой контейнер» будет контейнером объектов по умолчанию, к которым вы можете обращаться как массив (работает только с std :: vector и std :: deque), тогда вам нужноначать с resize (), и вы можете "очистить" с заливкой:

int n = 10;
std::vector<int> myVec;
myVec.resize(n);
myVec[4] = 5;
std::cout << myVec[4] << "\n";
std::fill(myVec.begin(), myVec.end(), int()); // ofcourse for int, you can use 0 instead of int()
std::cout << myVec[4] << "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...