Как создать все векторы, которые представляют собой некоторый примерный вектор, в котором отсутствует один элемент? - PullRequest
1 голос
/ 09 февраля 2012

У меня есть некоторый вектор элементов, переданных в функцию, и я хочу создать все векторы, которые являются этим исходным вектором, но один элемент отсутствует.

Какой самый простой способ сделать это в C ++?

Мой нынешний подход заключается в следующем, но еще не совсем выработано.

void list_one_removed(std::vector<Fruit> fruit)
{
    for (unsigned i = fruit.size(); i > 0; i--)
    {
        // copy 'fruit'
        // remove index i
        // add this vector to some vector of vectors.
    }
}

Ответы [ 2 ]

4 голосов
/ 09 февраля 2012

Ну, просто используйте итератор, чтобы определить текущее удаленное положение и создать вектор из всего, вплоть до этого итератора и всего, что после этого итератора:

std::vector<decltype(vec)> result;
for (auto it(vec.begin()), end(vec.end()); it != end; ) {
    result.push_back(decltype(vec)(vec.begin(), it));
    result.back().insert(result.back().end(), ++it, vec.end());
}
0 голосов
/ 09 февраля 2012

Использование <algorithm> и C ++ 11:

#include <algorithm>
#include <vector>

// personally, I would pass "in" as a couple of iterators
template<typename T>
std::vector<std::vector<T>> list_one_removed(const std::vector<T>& in)

{
    std::vector<std::vector<T>> result;
    for (auto itor = in.begin(); itor != in.end(); ++itor) {
        std::vector<T> buffer;
        std::copy_if(in.begin(),
                     in.end(),
                     std::back_inserter(buffer),
                     [&itor](const T& t){ return &t != &(*itor); });
        result.emplace_back(std::move(buffer));
    }
    return result;
}

Если у вас есть новый цикл «для каждого», вы можете сделать:

#include <algorithm>
#include <vector>

template<typename T>
std::vector<std::vector<T>> list_one_removed(const std::vector<T>& in)
{
    std::vector<std::vector<T>> result;
    for (const auto& foo : in) {
        std::vector<T> buffer;
        std::copy_if(in.begin(),
                     in.end(),
                     std::back_inserter(buffer),
                     [&foo](const T& t){ return &t != &foo; });
        result.emplace_back(std::move(buffer));
    }
    return result;
}

Если вы используете C ++ 03:

#include <algorithm>
#include <vector>

template<typename T> struct identity {
    const T& id_;
    identity(const T& id) : id_(id) { }

    bool operator()(const T& other) const
    {
        return &id_ == &other;
    }
};

template<typename T>
std::vector<std::vector<T> > list_one_removed(const std::vector<T>& in)
{
    std::vector<std::vector<T> > result;
    for (typename std::vector<T>::const_iterator itor = in.begin();
         itor != in.end();
         ++itor) {
        std::vector<T> buffer;
        std::remove_copy_if(in.begin(),
                            in.end(),
                            std::back_inserter(buffer),
                            identity<T>(*itor));
        result.push_back(buffer);
    }
    return result;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...