Most of the time we initialize an empty instance of STL containers and keep
adding elements to or removing elements from it. For example, we create a vector
and push_back
elements. But what if we want to fill a couple of initial elements?
Sequence container
vector
deque
string
Use initializer list
Almost all the container types support this kind of initialization.
vector<int> a{1,2,3};
deque<int> b{4,5,6};
Fill the same number
vector<int> a(10);
fill(begin(a), end(a), 0);
deque<int> b(10);
fill(begin(b), end(b), 0);
Fill custom numbers
vector<int> a(10);
int i = 0;
auto x = [&]() {return i++;};
generate(begin(a), end(a), x);
deque<int> b(10);
generate(begin(b), end(b), x);
Fill without predefined size
vector<int> a;
fill_n(back_inserter(a), 10, 1);
deque<int> b;
fill_n(back_inserter(b), 10, 1);
vector<int> c;
int i = 0;
auto x = [&]() {return i++;};
int n = 10;
generate_n(back_inserter(c), n, x);
deque<int> d;
generate_n(back_inserter(d), n, x);
Associative container
set
,unordered_set
map
,unordered_map
Initializer list
set<int> a{1,2,3};
map<int, int> b{ {1,2}, {2,3} };
Fill different number
set<int> a;
map<int, int> b;
int i = 0;
int n = 10;
generate_n(inserter(a, a.end()), n, [&]() {return i++;})
generate_n(inserter(b, b.end()), n, [&](){return make_pair(i++, 0);});
The iterators dereferenced from set
or map
is const which means we cannot directly modify it.
set<int> a{3};
*a.begin() = 3;
Due to previous reasons, we cannot use fill
or fill_n
to fill set
or map
.
Other possible methods
swap
: swap two containersassign
: clean the elements and replace themvector
,deque
,string
- constructors
vector<int> a{1,2,3};
vector<int> b;
b.swap(a);
vector<int> c;
c.assign(b.begin(), b.end());
vector<int> d(c);
vector<int> e(c.begin(), c.end());