Say I am initialization a vector<vector<string>>
like so:
vector<vector<string>> v;
v = {{
{"a", "b", "c"},
{"aa", "bb"},
{"xyz", "yzx", "zxy"},
{}
}};
Now suppose I want to append an already existing vector<string>
to some of v
's elements. Like so:
vector<string> suffix {{"1", "2", "3"}};
vector<vector<string>> v;
v = {{
{"a", "b", "c"} + suffix,
{"aa", "bb"},
{"xyz", "yzx", "zxy"} + suffix,
{}
}};
That syntax obviously doesn't work because operator+
is not defined in such a way.
I understand that it's possible to construct v
the first way and then write
vector<int> indices = {0, 2};
for(int i: indices)
v[i].insert(v[i].end(), suffix.begin(), suffix.end());
But this is not convenient because I may have several suffix
vectors that are attached to arbitrary v[i]
. I want the suffix
to be together with the initialization of the v[i]
so it makes sense and I don't have to shift indices if I add/remove elements from v
's initialization.
Initialize Vector in ConstructorPass a vector object v as a parameter to the constructor. Initialize vec = v. Declare a function show() to display the values of vector. print the all values of variable i.
An object of type std::initializer_list<T> is a lightweight proxy object that provides access to an array of objects of type const T .
The default value of a vector is 0. Syntax: // For declaring vector v1(size); // For Vector with default value 0 vector v1(5);
One possible solution is to use a helper function that does the appending.
vector<string> appendStrings(vector<string>&& s1, vector<string> const& s2)
{
s1.insert(s1.end(), s2.begin(), s2.end());
return s1;
}
And use it to initialize the variable.
vector<string> suffix {{"1", "2", "3"}};
vector<vector<string>> v = {{
appendStrings({"a", "b", "c"}, suffix),
{"aa", "bb"},
appendStrings({"xyz", "yzx", "zxy"}, suffix),
{}
}};
Update
A more efficient implementation of appendStrings
(Thanks to @Yakk):
vector<string> appendStrings(initializer_list<char const*>&& s1,
vector<string> const& s2)
{
vector<string> ret.
ret.reserve(s1.size() + s2.size());
for (auto item : s1 ) {
ret.emplace_back(item);
}
ret.insert(ret.end(), s2.begin(), s2.end() );
return ret;
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With