Извлечь подмножество векторов векторов

Я знаю, как извлечь подмножество из нормального вектора и как извлечь подмножество из вектора, который находится внутри другого вектора. Теперь мой вопрос, как я могу извлечь подмножества всех векторов, которые находятся внутри другого вектора.

Например: у меня есть три вектора внутри другого:

std::vector<std::vector<int>> my_vec;
std::vector<int> vec_1{1,2,3,4,5};
std::vector<int> vec_2{11,12,13,14,15};
std::vector<int> vec_3{21,22,23,24,25};

my_vec.push_back(vec_1);
my_vec.push_back(vec_2);
my_vec.push_back(vec_3);

Теперь я хочу создать новый вектор, который содержит подмножество третьего и четвертого элемента каждого вектора. Я попробовал это:

#include<vector>
#include <iostream>

int main()
{
std::vector<std::vector<int>> my_vec;
std::vector<int> vec_1{1,2,3,4,5};
std::vector<int> vec_2{11,12,13,14,15};
std::vector<int> vec_3{21,22,23,24,25};

my_vec.push_back(vec_1);
my_vec.push_back(vec_2);
my_vec.push_back(vec_3);

// For a normal vector
std::vector<int> vec_1_subset(vec_1.begin()+2,vec_1.begin()+4);

for (auto& element: vec_1_subset)
{
std::cout<<element<<std::endl;
}

// For extracting from a single vector inside another vector
std::vector<int> my_vec_subset((my_vec[0]).begin()+2,(my_vec[0]).begin()+4);

for (auto& element: my_vec_subset)
{
std::cout<<element<<std::endl;
}

// For several vectors inside a vector ?
std::vector<std::vector<int>> my_vec_test_subset(my_vec.begin()+2,my_vec.begin()+4);

return 0;
}

Последняя попытка создает сообщение об ошибке.

Всего 4 ответа

Автоматический диспенсер мыльной пены от xiaomi.


Вы можете сделать что-то вроде:

std::vector<std::vector<int>> res;
res.reserve(my_vec.size());

std::transform(my_vec.begin(), my_vec.end(),
               std::back_inserter(res),
               [](const std::vector<int>& v){ return std::vector<int>{v.begin() + 2,
                                                                      v.begin() + 4}; });

auto GetVectorSubset(const vector<vector<int>>& source)
{
    std::vector<int> result;
    result.reserve(source.size()*2);

    for (const auto &vec: source)
    {
        try
        {
            result.emplace_back(vec.at(2));
            result.emplace_back(vec.at(3));
        }
        catch(std::exception&) {};
    }

    return result;
}

Этот пример может быть не самым оптимальным, но он хорош и выполняет свою работу. Он основан на том факте, что метод vector :: at () вызовет исключение, если вы выйдете за пределы.

Если исключение слишком уродливо для вас, вам нужно проверить размер вектора 2 раза:

if (vec.size() > 2) result.emplace_back(vec[2]);
if (vec.size() > 3) result.emplace_back(vec[3]);

Следите за моим последним комментарием:

Если я правильно понимаю ваш вопрос, то один из возможных способов сделать это приведен ниже:

#include <vector>
#include <iostream>

int main(){
    std::vector<std::vector<int>> my_vec;
    std::vector<int> vec_1{1,2,3,4,5};
    std::vector<int> vec_2{11,12,13,14,15};
    std::vector<int> vec_3{21,22,23,24,25};
    my_vec.push_back(vec_1);
    my_vec.push_back(vec_2);
    my_vec.push_back(vec_3);
    std::vector<std::vector<int>> my_vec_test_subset;
    for(const auto vec:my_vec)
        my_vec_test_subset.push_back({vec.begin()+2,vec.begin()+4});
    for(const auto vec:my_vec_test_subset){
        for(const auto i:vec)
            std::cout<<i<<" ";
        std::cout<<std::endl;
    }
    return 0;
}

Выход

3 4 
13 14 
23 24

my_vec_test_subset (my_vec.begin () + 2, my_vec.begin () + 4); тип будет std :: vector> not std :: vector, а my_vec имеет только три (не четыре) элемента и выдаст исключение, если вы исправите тип

если вам нужен std :: vector, который включает в себя массив элементов 3 и 4 из N векторов, указанных ниже, то код вам нужен

    std::vector<int> finalV;
for (auto& element : my_vec) {
    finalV.insert(finalV.end(), element.begin()+2, element.begin()+4);
}

и если вы хотите, чтобы векторные векторы содержали 3-й и 4-й элементы элементов my_vec, вот код, который вам нужен

std::vector<std::vector<int>> finalV2;
for (auto& element : my_vec) {
    finalV2.push_back(std::vector<int>(element.begin() + 2, element.begin() + 4));
}

Есть идеи?

10000