Я хочу отсортировать два массива a и b одного и того же размера следующим образом: Array b упорядочен так же, как сортируется массив a. Пример входных данные:Соответствующий итератор STL для двух массивов
a = {3, 1, 5}
b = {2, 6, 4}
Пример из
a = {1, 3, 5}
b = {6, 2, 4}
Такое, что значения Ь не имеют значение для их переупорядочений, но вместо того, чтобы следовать за переупорядочением массива.
Я хочу использовать stl :: sort для этого, и мне нужно сделать это как можно эффективнее. Поэтому я не хочу копировать все элементы в структуры или заказывать массив с индексом, который впоследствии я мог использовать для упорядочения массивов a и b. То, что, по моему мнению, было наименее затратным, должно быть RandomAccessIterator (так как сортировка требует произвольного доступа). Теперь моя проблема в том, что я действительно не так хорош в C++. Если бы кто-то мог дать мне подсказки на уровне, который мог бы понять, я был бы в восторге. Я нашел несколько решений:
Sorting two corresponding arrays, но оба предложенных решения не кажется достаточно производительными,
http://www.stanford.edu/~dgleich/notebook/2006/03/sorting_two_arrays_simultaneou.html который использует материал наддува, который я предполагаю, что перерывы в соответствии с СТЛ (также если честно, я не понимаю все там, где используется шаблон, у меня есть двойной и массив int и размер n для обоих, поэтому я не думаю, что мне нужны шаблоны), и, наконец, это
http://www.c-plusplus.de/forum/313698-full решение, где я застрял в точке, не знаю, как реализовать operator-> и operator *, поскольку я не знаю, могу ли я вернуть только одно значение (значение из массива a), т.е. если это значение используется только для c omparison или также для присвоения значений. также решение в этом потоке сравнивает значения указателя для операторов сравнения, которые я не уверен в правильности (не должны ли это значения за указателями?).
Вот что я до сих пор, если вы видите ужасную Noob ошибка пожалуйста скажи мне, где я пошло не так :)
#include "DoubleArrayRAccIterator.h"
DoubleArrayRAccIterator::~DoubleArrayRAccIterator() {
// TODO Auto-generated destructor stub
}
struct doubleValue{
double* a_val;
int* b_val;
};
double::DoubleArrayRAccIterator::DoubleArrayRAccIterator(double& a_arr,int& b_arr, int size) {
a_begin = &a_arr;
b_begin = &b_arr;
a = &a_arr;
b = & b_arr;
n = size;
}
DoubleArrayRAccIterator::DoubleArrayRAccIterator() {
a = 0;
b = 0;
n = 0;
}
DoubleArrayRAccIterator::DoubleArrayRAccIterator(const DoubleArrayRAccIterator& it) {
a = it.a;
b = it.b;
n = it.n;
}
DoubleArrayRAccIterator& DoubleArrayRAccIterator::operator=(const DoubleArrayRAccIterator& it) {
a = it.a;
b = it.b;
n = it.n;
return *this;
}
DoubleArrayRAccIterator& DoubleArrayRAccIterator::operator++() {
++a;
++b;
return *this;
}
DoubleArrayRAccIterator& DoubleArrayRAccIterator::operator--() {
--a;
--b;
return *this;
}
DoubleArrayRAccIterator DoubleArrayRAccIterator::operator++(int) {
DoubleArrayRAccIterator it(*this);
++a;
++b;
return it;
}
DoubleArrayRAccIterator DoubleArrayRAccIterator::operator--(int) {
--a;
--b;
return *this;
}
DoubleArrayRAccIterator& DoubleArrayRAccIterator::operator+=(diff_type x) {
a += x;
b += x;
return *this;
}
DoubleArrayRAccIterator& DoubleArrayRAccIterator::operator-=(diff_type x) {
a += x;
b += x;
return *this;
}
DoubleArrayRAccIterator DoubleArrayRAccIterator::operator+(diff_type x) const {
a += x;
b += x;
return *this;
}
typename DoubleArrayRAccIterator DoubleArrayRAccIterator::operator-(diff_type x) const {
a -= x;
b -= x;
return *this;
}
DoubleArrayRAccIterator DoubleArrayRAccIterator::operator+(const DoubleArrayRAccIterator& it) const {
a += it.a;
b += it.b;
return *this;
}
DoubleArrayRAccIterator DoubleArrayRAccIterator::operator-(const DoubleArrayRAccIterator& it) const {
a -= it.a;
b -= it.b;
return *this;
}
DoubleArrayRAccIterator::reference DoubleArrayRAccIterator::operator*() const {
// this MUST be wrong, only return value of array a?
doubleValue result;
result.a_val=a;
result.b_val=b;
return *result;
}
DoubleArrayRAccIterator::pointer DoubleArrayRAccIterator::operator->() const {
// this MUST be wrong, only return value of array a?
doubleValue result;
result.a_val=a;
result.b_val=b;
return &result;
}
DoubleArrayRAccIterator::reference DoubleArrayRAccIterator::operator[](diff_type x) const {
// this MUST be wrong, only return value of array a?
doubleValue result;
result.a_val=a_begin+x;
result.b_val=b_begin+x;
return *result;
}
bool DoubleArrayRAccIterator::operator==(const DoubleArrayRAccIterator& it) const {
return a == it.a;
//compare indices or values here?
}
bool DoubleArrayRAccIterator::operator!=(const DoubleArrayRAccIterator& it) const {
return a != it.a;
//compare indices or values here?
}
bool DoubleArrayRAccIterator::operator<(const DoubleArrayRAccIterator& it) const {
//compare indices or values here?
}
bool DoubleArrayRAccIterator::operator>(const DoubleArrayRAccIterator& it) const {
//compare indices or values here?
}
bool DoubleArrayRAccIterator::operator<=(const DoubleArrayRAccIterator& it) const {
//compare indices or values here?
}
bool DoubleArrayRAccIterator::operator>=(const DoubleArrayRAccIterator& it) const {
//compare indices or values here?
}
DoubleArrayRAccIterator begin() {
return DoubleArrayRAccIterator(a_begin, b_begin, n);
}
DoubleArrayRAccIterator end() {
return DoubleArrayRAccIterator(a_begin + n, b_begin + n, n);
}
И если кто-то не остановить чтение еще и до сих пор имеют терпение, я запутанные типами «diff_type», «reference» и «pointer», которые я только что скопировал здесь http://www.c-plusplus.de/forum/313698-full, какими они должны быть?
простые указатели * есть * итераторы произвольного доступа. вы можете просто использовать их. –
Привет, Арне, спасибо за ваш ответ. Я хочу передать итератор функции сортировки, и для того, чтобы оба массива были отсортированы, мне нужно одновременно перебирать оба массива. –
Я вижу, это было не так ясно для меня, когда я читал ваш вопрос - просто забудьте мой комментарий, пожалуйста;) –