Внутри кода, в котором вы создаете строку, обратная косая черта сначала является символом escape-кода javascript, что означает, что escape-последовательности, такие как \t
, \n
, \"
и т. д., будут переведены в их javascript-аналог (вкладка, новая строка, цитата и т. д.), и это будет сделано частью строки. Double-backslash представляет собой одиночную обратную косую черту в самой собственно строке, поэтому, если вам нужна обратная косая черта в строке, вы сначала избегаете ее.
Итак, когда вы создаете строку, говоря var someString = '(\\s|^)'
re действительно делает создание фактической строки со значением (\s|^)
.
Вот решение с variadic templates
template<typename T, typename ...Args>
void appendVector(vector<T>& v1, vector<T>& v2, Args... args)
{
v1.insert(v1.end(), v2.begin(), v2.end());
appendVector(v1, args...);
}
template<typename T>
void appendVector(vector<T>& v1, vector<T>& v2)
{
v1.insert(v1.end(), v2.begin(), v2.end());
}
Вам просто нужно добавить свои векторы:
vector<string> newVector;
newVector.reserve(a.size()+b.size()+c.size()+d.size());
appendVector(newVector, a, b, c, d);
Если вы можете использовать диапазон v3 , вы можете просто сделать это:
std::vector<std::string> allVec = ranges::view::concat(a, b, c, d);
См. Демонстрацию здесь .
Вы можете использовать это с любым векторным типом.
Попробуйте что-то вроде этого:
template<typename T>
std::vector<T> merge(std::initializer_list<std::vector<T>*> vecs)
{
size_t size = 0;
for(auto v : vecs) { size += v->size(); }
std::vector<T> ret;
ret.reserve(size);
for(auto v : vecs) { ret.insert(ret.end(), v->begin(), v->end()); }
return ret;
}
std::vector<std::string> a = {"a", "b"};
std::vector<std::string> b = {"c", "d"};
std::vector<std::string> c = {"e", "f"};
std::vector<std::string> d = {"g", "h"};
std::vector<std::string> newVector = merge({&a, &b, &c, &d});
Альтернативно:
template<typename T>
std::vector<T> merge(std::initializer_list<std::reference_wrapper<const std::vector<T>>> vecs)
{
size_t size = 0;
for(auto &v : vecs) { size += v.get().size(); }
std::vector<T> ret;
ret.reserve(size);
for(auto &v : vecs) { ret.insert(ret.end(), v.get().begin(), v.get().end()); }
return ret;
}
[1110 ]
std::vector<std::string> a = {"a", "b"};
std::vector<std::string> b = {"c", "d"};
std::vector<std::string> c = {"e", "f"};
std::vector<std::string> d = {"g", "h"};
std::vector<std::string> newVector = merge({std::cref(a), std::cref(b), std::cref(c), std::cref(d)});