3

私はのベクトルを持っています

struct Data {
    size_t iLo;
    size_t iHi;
};

iLoと の値を個別に並べ替えたいiHi。つまり、iLoメンバーを並べ替えても、'iHi' メンバーは変更されません。iLos は昇順にソートされ、iHis は降順にソートされます。例えば:

{{1, 3}, {4, 66}, {0, 0}, {0, 1}}; 

iLosを昇順で最初にソートすると、

{{0, 3}, {0, 66}, {1, 0}, {4, 1}};

iHi次に、 s の降順でソートすると、次のようになります。

{{0, 66}, {0, 3}, {1, 1}, {4, 0}};

これを行う理由は、膨大な量のデータを扱っており、元の配列データを 2 つの新しい配列データに分割するのに十分な RAM がない可能性があるためです。まずは現地で試してみたい。

Boost を使用できず、c++03 までしか使用できません。

4

3 に答える 3

3

iLo (または iHi など) への参照を返すランダム アクセス イテレータをに書き込む必要があります。vector<Data>

完全な例:

#include <vector>
#include <algorithm>
#include <iterator>
#include <functional>
#include <iostream>

using namespace std;

struct Data {
    Data(size_t l, size_t h) : iLo(l), iHi(h) {}

    size_t iLo;
    size_t iHi;
};

// `MyIter` is the base for your iterators that return i->iLo / i->iHi.
template <class Impl> // Impl is the actual iterator type.
struct MyIter : public iterator<random_access_iterator_tag, size_t>
{
    typedef vector<Data>::iterator Base;
    Base base;

    MyIter(Base i) : base(i) {}

    // These are common operators that you have to define in GNU's std::sort.
    // The standard actually requires more operators, see
    // http://en.cppreference.com/w/cpp/concept/RandomAccessIterator

    bool operator !=(const Impl &rhs) const {
        return base != rhs.base;
    }
    bool operator ==(const Impl &rhs) const {
        return base == rhs.base;
    }
    bool operator <(const Impl &rhs) const {
        return base < rhs.base;
    }
    bool operator >(const Impl &rhs) const {
        return base > rhs.base;
    }
    bool operator >=(const Impl &rhs) const {
        return base >= rhs.base;
    }
    bool operator <=(const Impl &rhs) const {
        return base <= rhs.base;
    }
    ptrdiff_t operator -(const Impl &rhs) const {
        return base - rhs.base;
    }
    Impl operator +(ptrdiff_t i) const {
        return base + i;
    }
    Impl operator -(ptrdiff_t i) const {
        return base - i;
    }
    Impl &operator ++() {
        ++base;
        return static_cast<Impl&>(*this);
    }
    Impl &operator --() {
        --base;
        return static_cast<Impl&>(*this);
    }
    Impl &operator +=(size_t n) {
        base += n;
        return static_cast<Impl&>(*this);
    }
    Impl &operator -=(size_t n) {
        base -= n;
        return static_cast<Impl&>(*this);
    }
};

struct MyLoIter : public MyIter<MyLoIter>
{
    MyLoIter(Base i) : MyIter(i) {}

    size_t &operator [](int i) {
        return base[i].iLo;
    }
    size_t &operator *() {
        return base->iLo;
    }
};

struct MyHiIter : public MyIter<MyHiIter>
{
    MyHiIter(Base i) : MyIter(i) {}

    size_t &operator [](int i) {
        return base[i].iHi;
    }
    size_t &operator *() {
        return base->iHi;
    }
};

int main() {
    // I like C++11 a lot better ...
    vector<Data> data;
    data.push_back(Data(1, 3));
    data.push_back(Data(4, 66));
    data.push_back(Data(0, 0));
    data.push_back(Data(0, 1));

    // This is the actual sorting, first the iLo part, then the iHi part.
    // std::less and std::greater are used to sort descending and ascending-
    sort(MyLoIter(data.begin()), MyLoIter(data.end()), less<size_t>());
    sort(MyHiIter(data.begin()), MyHiIter(data.end()), greater<size_t>());

    // Now the test if it worked:
    for (vector<Data>::iterator i = data.begin(); i != data.end(); ++i) {
        cout << i->iLo << "\t" << i->iHi << endl;
    }
    return 0;
}

ライブ実行: http://ideone.com/gr2zSj

于 2013-03-10T04:06:38.163 に答える
2

この方法で標準ライブラリを並べ替えようとするのは悪夢です。

最善の策は、単純なクイック ソート ルーチンをコピーして、特定の目的に合わせて調整することです。それはコードのページについてだけであるべきです。

于 2013-03-10T04:07:36.810 に答える
-2
struct LoComparator
{
    bool operator()(const Data& d1, const Data& d2)
    {
        return d1.iLo < d2.iLo;
    }
};

struct HiComparator
{
    bool operator()(const Data& d1, const Data& d2)
    {
        return d1.iHi > d2.iHi;
    }
};

iLo で並べ替えるには:

Data d[3] = {{3, 4}, {1, 2}, {5, 6}};
sort(&d[0], &d[3], LoComparator());

iHi で並べ替えるには:

Data d[3] = {{3, 4}, {1, 2}, {5, 6}};
sort(&d[0], &d[3], HiComparator());
于 2013-03-10T03:17:36.143 に答える