Как std:: изменить размер вектора, присвоив значение по умолчанию

#c #vector

#c #вектор

Вопрос:

У меня есть std::vector<bool> v Я хочу изменить его размер и присвоить значение false всем его элементам. Как я могу сделать это эффективно (без цикла) Как я могу это сделать?

Комментарии:

1. Смотрите en.cppreference.com/w/cpp/container/vector/resize . Вы хотите установить все элементы или только новые?

2. @BessieTheCow — все . (v пусто)

3. Просто используйте вторую перегрузку на странице, на которую я ссылался, или передайте количество элементов и значение конструктору.

4. std::vector<bool> специализирован для упаковки с учетом экономии места. Но у него есть некоторые особенности в поведении, если ожидать общего поведения std::vector. Если вам действительно нужно неспециализированное поведение, рассмотрите enum class bool_t: bool { false_v, true_v }; и std::vector<bool_t> . (Жаль, что у них не было std::vector_bool такого упакованного поведения. Увы, этот корабль уплыл.)

Ответ №1:

Если v он уже создан, вы можете использовать assign метод для достижения своей цели.

 v.assign(count, false);
  

ПРИМЕЧАНИЕ: vector<bool> может быть оптимизировано с точки зрения экономии места и ведет себя иначе, чем другие типы vector , например, базовое хранилище может быть не смежным. И вы, возможно, захотите заменить его на vector<int> или bitset<N> . Вы можете проверить документ для получения подробной информации.

Ответ №2:

Вы можете использовать следующий подход

 #include <iostream>
#include <vector>

using namespace std;

int main(void) {
    vector<bool> v(5,true);
    
    cout << "Initial size  = " << v.size() << endl;
    
    /* displaying Initial vector values */
    for (int i = 0; i < v.size();   i)
       cout << v[i] << " ";
    cout<<endl;
    
    /* 
        Resize it to required length
        Parameters:

        1st argument – it is a new container size, expressed in a number of elements.
        2nd argument – if this parameter is specified then new elements are 
                       initialized with this value.
    */  
    
    v.resize(10,false);
    
    cout << "Size after resize = " << v.size() << endl;
    
    /* displaying current vector values */
    for (int i = 0; i < v.size();   i)
       cout << v[i] << " ";
    cout<<endl;
    
    
    /* 
        assign new values to the vector
        1. length upto which new values are to be assigned
        2. value to be assign
    */
    v.assign(v.size(),false);

    cout << "size after assign = " << v.size() << endl;
    
    /* display modified vector values */
    for (int i = 0; i < v.size();   i)
       cout << v[i] << " ";

    return 0;
}
  

Вывод:

 Initial size  = 5
1 1 1 1 1 
Size after resize = 10
1 1 1 1 1 0 0 0 0 0 
size after assign = 10
0 0 0 0 0 0 0 0 0 0 
  

Комментарии:

1. Не делайте int i = 0; i < v.size(); i . Во-первых, у вас несоответствие типа подписи: int подписано, v.size() беззнаково, во-вторых, на 64-разрядной машине у вас, вероятно, будет несоответствие размера, int обычно 32 бита, v.size() 64 бита.