Есть ли способ объединить несколько векторов просто? - PullRequest
0 голосов
/ 17 января 2019

В настоящее время существуют способы объединения или объединения двух векторов с одной функцией.

Но, похоже, нет способа объединить или объединить более трех векторов с одной функцией.

Например,

vector<string> a = {"a", "b"};
vector<string> b = {"c", "d"};
vector<string> c = {"e", "f"};
vector<string> d = {"g", "h"};

// newVector has to include {"a", "b", "c", "d", "e", "f", "g", "h"}
vector<string> newVector = function(a, b, c, d);

Если нет, кажется, что это можно реализовать с помощью variadic template .

Но я не могу представить, как это может быть реализовано с помощью variadic template .

Есть ли какие-нибудь решения?

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Если вы можете использовать range v3 , вы можете просто сделать это:

std::vector<std::string> allVec = ranges::view::concat(a, b, c, d);

См. Демоверсию здесь .

Вы можете использовать это с любым векторным типом.

0 голосов
/ 17 января 2019

Попробуйте что-то вроде этого:

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});

Live Demo

В качестве альтернативы:

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;
}

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)});

Демо-версия

0 голосов
/ 17 января 2019

Вот решение с 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...