#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 бита.