В Java все находится в форме класса.
Если вы хотите использовать любой объект, тогда у вас есть две фазы:
Пример:
Object a;
a=new Object();
То же самое для концепции массива
Item i[]=new Item[5];
i[0]=new Item();
Если вы не дают секцию инициализации, тогда возникает NullpointerException
.
подход Фриоля хорош когда вместе с Вашим. Во-первых, создайте вектор, состоящий из чисел 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;
}
Я думаю, что Вы действительно потребность (но исправляют меня, если я неправ) является способом получить доступ к элементам контейнера в некотором порядке.
Вместо того, чтобы перестроить мой исходный набор, я одолжил бы понятие у Проектирования баз данных: сохраните индекс, заказанный определенным критерием. Этот индекс является дополнительной косвенностью, которая предлагает большую гибкость.
Этот путь возможно генерировать несколько индексов по словам различных членов класса.
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, В-третьих...}, {1, Во-первых...}), тогда сортируют этот вектор по первому полю, и затем разделяют структуры снова.
, Вероятно, существует лучшее решение в Повышении или пользовании стандартной библиотекой.
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}
Теперь можно использовать "индексный" вектор для индексации в вектор "Значений".
Поместите свои значения в , Мультииндексный контейнер Повышения тогда выполняет итерации для чтения значений в порядке, который Вы хотите. Можно даже скопировать их в другой вектор, если Вы хотите.