Как делают я сортирую станд.:: вектор значениями другого станд.:: вектор?

В Java все находится в форме класса.

Если вы хотите использовать любой объект, тогда у вас есть две фазы:

  1. Объявить
  2. Инициализация

Пример:

  • Объявление: Object a;
  • Инициализация: a=new Object();

То же самое для концепции массива

  • Объявление: Item i[]=new Item[5];
  • Инициализация: i[0]=new Item();

Если вы не дают секцию инициализации, тогда возникает NullpointerException.

53
задан CinCout 17 April 2018 в 02:53
поделиться

5 ответов

подход Фриоля хорош когда вместе с Вашим. Во-первых, создайте вектор, состоящий из чисел 1†¦ n, наряду с элементами от вектора, диктующего порядок сортировки:

typedef vector<int>::const_iterator myiter;

vector<pair<size_t, myiter> > order(Index.size());

size_t n = 0;
for (myiter it = Index.begin(); it != Index.end(); ++it, ++n)
    order[n] = make_pair(n, it);

Теперь можно отсортировать этот массив с помощью пользовательского сортировщика:

struct ordering {
    bool operator ()(pair<size_t, myiter> const& a, pair<size_t, myiter> const& b) {
        return *(a.second) < *(b.second);
    }
};

sort(order.begin(), order.end(), ordering());

Теперь Вы получили порядок перестановки в order (более точно в первом компоненте объектов). Можно теперь использовать это упорядочивание для сортировки других векторов. Существует, вероятно, очень умное оперативное различное выполнение в то же время, но пока кто-то еще не придумывает его, вот один вариант, который не существует. Это использует order в качестве таблицы поиска для нового индекса каждого элемента.

template <typename T>
vector<T> sort_from_ref(
    vector<T> const& in,
    vector<pair<size_t, myiter> > const& reference
) {
    vector<T> ret(in.size());

    size_t const size = in.size();
    for (size_t i = 0; i < size; ++i)
        ret[i] = in[reference[i].first];

    return ret;
}
31
ответ дан nicegom 7 November 2019 в 08:51
поделиться

Я думаю, что Вы действительно потребность (но исправляют меня, если я неправ) является способом получить доступ к элементам контейнера в некотором порядке.

Вместо того, чтобы перестроить мой исходный набор, я одолжил бы понятие у Проектирования баз данных: сохраните индекс, заказанный определенным критерием. Этот индекс является дополнительной косвенностью, которая предлагает большую гибкость.

Этот путь возможно генерировать несколько индексов по словам различных членов класса.

using namespace std;

template< typename Iterator, typename Comparator >
struct Index {
    vector<Iterator> v;

    Index( Iterator from, Iterator end, Comparator& c ){
        v.reserve( std::distance(from,end) );
        for( ; from != end; ++from ){
            v.push_back(from); // no deref!
        }
        sort( v.begin(), v.end(), c );
    }

};

template< typename Iterator, typename Comparator >
Index<Iterator,Comparator> index ( Iterator from, Iterator end, Comparator& c ){
    return Index<Iterator,Comparator>(from,end,c);
}

struct mytype {
    string name;
    double number;
};

template< typename Iter >
struct NameLess : public binary_function<Iter, Iter, bool> {
    bool operator()( const Iter& t1, const Iter& t2 ) const { return t1->name < t2->name; }
};

template< typename Iter >
struct NumLess : public binary_function<Iter, Iter, bool> {
    bool operator()( const Iter& t1, const Iter& t2 ) const { return t1->number < t2->number; }
};

void indices() {

    mytype v[] =    { { "me"    ,  0.0 }
                    , { "you"   ,  1.0 }
                    , { "them"  , -1.0 }
                    };
    mytype* vend = v + _countof(v);

    Index<mytype*, NameLess<mytype*> > byname( v, vend, NameLess<mytype*>() );
    Index<mytype*, NumLess <mytype*> > bynum ( v, vend, NumLess <mytype*>() );

    assert( byname.v[0] == v+0 );
    assert( byname.v[1] == v+2 );
    assert( byname.v[2] == v+1 );

    assert( bynum.v[0] == v+2 );
    assert( bynum.v[1] == v+0 );
    assert( bynum.v[2] == v+1 );

}
3
ответ дан xtofl 7 November 2019 в 08:51
поделиться

Только одно грубое решение прибывает по моему мнению: создайте вектор, который является суммой всех других векторов (вектор структур, как {3, В-третьих...}, {1, Во-первых...}), тогда сортируют этот вектор по первому полю, и затем разделяют структуры снова.

, Вероятно, существует лучшее решение в Повышении или пользовании стандартной библиотекой.

4
ответ дан Gabriele D'Antona 7 November 2019 в 08:51
поделиться
typedef std::vector<int> int_vec_t;
typedef std::vector<std::string> str_vec_t;
typedef std::vector<size_t> index_vec_t;

class SequenceGen {
  public:
    SequenceGen (int start = 0) : current(start) { }
    int operator() () { return current++; }
  private:
    int current;
};

class Comp{
    int_vec_t& _v;
  public:
    Comp(int_vec_t& v) : _v(v) {}
    bool operator()(size_t i, size_t j){
         return _v[i] < _v[j];
   }
};

index_vec_t indices(3);
std::generate(indices.begin(), indices.end(), SequenceGen(0));
//indices are {0, 1, 2}

int_vec_t Index = { 3, 1, 2 };
str_vec_t Values = { "Third", "First", "Second" };

std::sort(indices.begin(), indices.end(), Comp(Index));
//now indices are {1,2,0}

Теперь можно использовать "индексный" вектор для индексации в вектор "Значений".

9
ответ дан Calimo 7 November 2019 в 08:51
поделиться

Поместите свои значения в , Мультииндексный контейнер Повышения тогда выполняет итерации для чтения значений в порядке, который Вы хотите. Можно даже скопировать их в другой вектор, если Вы хотите.

8
ответ дан Dave Hillier 7 November 2019 в 08:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: