Как уже упоминалось, главная причина этого в том, что когда вы передаете mhdr в качестве компаратора, вы делаете копию.Эта копия содержит указатель на тот же вектор.Когда эта копия уничтожается, этот вектор уничтожается, разрушая коллекцию, которая была между вашими итераторами.
Это было бы очевидно, если бы вы предотвратили копирование и присвоение, объявив эти операторы частными и не реализовав их.
Причина, по которой вы попали в этот беспорядок, заключается в том, что ваш класс Hdr имеет две разные функции - поддержание вектора и наличие функции сравнения.Классы должны делать одно и одно хорошо.
Решение, приведенное ниже, исправляет эти проблемы, а также некоторые другие проблемы, такие как представление элементов данных как public
(хотя я сохранил указатель на vector
, так какЯ подозреваю, что вы пытались проиллюстрировать что-то об этом деле, хотя я согласен с другими ответчиками, что это сомнительное решение)
#include <stdio.h>
#include <algorithm>
#include <vector>
#include <memory>
class Hdr
{
public:
Hdr(int N);
~Hdr();
typedef std::vector<long>::iterator OrderIt;
OrderIt orderBegin();
OrderIt orderEnd();
long orderAt(int index) const;
private:
Hdr& operator=(const Hdr&);
Hdr(const Hdr&);
std::auto_ptr<std::vector<long> > order;
};
class Comparator
{
public:
bool operator()(long i1, long i2) const;
};
Hdr::Hdr(int N)
{
order = std::auto_ptr<std::vector<long> >(new std::vector<long>(N,0));
for(int k=0;k<N;k++)
{
(*order)[k] = -k;
}
};
Hdr::~Hdr()
{
order->clear();
};
Hdr::OrderIt Hdr::orderBegin()
{
return order->begin();
}
Hdr::OrderIt Hdr::orderEnd()
{
return order->end();
}
long Hdr::orderAt(int nIndex) const
{
return order->at(nIndex);
}
bool Comparator::operator()(long i1, long i2) const
{
return (i1<i2);
};
int main(void)
{
Hdr mhdr(1000);
std::sort(mhdr.orderBegin(),mhdr.orderEnd(), Comparator());
printf("value at 300 = %d\n",mhdr.orderAt(300));
};