STL, noob: отсортировать лист векторов
template<class T>
bool compareFirstElements(const vector<T>& lhs, const vector<T>& rhs) { return lhs[0] < rhs[0]; }
template<class T>
bool firstElementsEqual(const vector<T>& lhs, const vector<T>& rhs) { return lhs[0] == rhs[0]; }
list<vector<int>> l;
l.sort(compareFirstElements);
unique(l.begin l.end firstElementsEqual);
А что тебе не нравится?
http://stackoverflow.com/questions/3909272/sorting-two-corre...
не нравится тем, что доп. памяти много: приходится все копировать в отдельную структуру. Вообще задача часто встречается, да.
вот лучше решение, имхо не нравится тем, что доп. памяти много: приходится все копировать в отдельную структуру. Вообще задача часто встречается, да.
Только, все-таки, нужно l.sort; вызывать - у листа не random-access итераторы, поэтому вызов обычного std::sort будет неэффективным
да, налошил, исправлю
std::multimap<int, int> mm;
for(int i = 0; i < v2.size; ++i)
mm.insert(std::make_pair(v1[i], v2[i];
std::multimap<int, int>::const_iterator it = mm.begin;
v2.clear;
while(it != mm.end
{
v2.push_back( it->second );
++it;
}
кстати да, там уж лучше список не из vector'ов, а из pair делать как минимум.
Мне очень понравилась идея с сортиовкой индексов, потому что на самом деле таких у меня массивов несколько, а первый (по которому сортируем) у них общий.
Про pair просто не знал — это конечно намного логичней. А так конечно надо подучить матчасть. Кстати, какие бы могли порекомендовать туториалы по STL?
10^20 int'ов это же ~ 2^69 байтов памяти o_O
это не туториал, а референс и его лошат
имхо, это то что надо, чтобы быстро посмотреть существующие контейнеры и алгоритмы, а также посмотреть у какого контейнера что как называется - insert, push_back, push etc, как перегружено, какие типы возвращает.
В любом случае cppreference более почитаем
не думаю что ТС надо что-то в духе: "А теперь, дети, мы создадим массив из 3 элементов и применим к нему алгоритм сортировки"
10^20 int'ов это же ~ 2^69 байтов памяти o_Oтам основание степени в двоичной системе записано
Да, я фигню написал, 2^20 элементов максимум. Так что показатель степени в двоичном виде, да )
А на дополнительную память ограничения есть? Если нет, с мапом имхо нагляднее, чем с функторамиИмхо с явной сортировкой и лямбдами еще нагляднее И память не так мучает:
vector<int> v1, v2;
vector<pair<int,int>> m;
m.reserve(v1.size;
for (auto i = v1.begin j = v2.begin; i != v1.end; ++i, ++j)
m.push_back(make_pair(*i, *j;
std::sort(m.begin m.end [] (const pair<int,int>& l, const pair<int,int>& r) { return l.first < r.first; });
На компилируемость не проверял.
Кстати, если уж на то пошло, чтобы восполнить пробелы в области алгоритмов, как правильно сформулированная мною задача называется?
сейчас c++11 уже default?
Так уже и год почти 2013-й, пора: )
for (auto i = v1.begin j = v2.begin; i != v1.end; ++i, ++j)
m.push_back(make_pair(*i, *j;
Так уже и год почти 2013-й, пора: )
Ну тогда уж надо писать так:
for (auto i = v1.cbegin j = v2.cbegin; i != v1.cend; ++i, ++j)
m.push_back(make_pair(*i, *j;
или так:
for (auto i = begin(v1 j = begin(v2); i != end(v1); ++i, ++j)
m.push_back(make_pair(*i, *j;
(А std::cbegin и std::cend комитетчики _забыли_, лол!)
for (auto i = v1.cbegin j = v2.cbegin; i != v1.cend; ++i, ++j)
m.emplace_back(*i, *j);
http://en.cppreference.com/w/, мне кажется.
Более новый и глубокий, хотя статей гораздо меньше, конечно.
Лучше Более новый и глубокий, хотя статей гораздо меньше, конечно.
for (auto i = v1.begin j = v2.begin; i != v1.end; ++i, ++j)Фу.
m.push_back(make_pair(*i, *j;
Хоть бы
std::transform(i.cbegin i.cend j.cbegin m.begin [](int i, int j){return std::make_pair(i, j);});
Кстати, если уж на то пошло, чтобы восполнить пробелы в области алгоритмов, как правильно сформулированная мною задача называется?
Sorting two corresponding arrays - вполне ок название. По-русски будет примерно так: "Сортировка двух связанных массивов".
з.ы. я в таких случаях всегда делал структурку (с реализованным сравнением) и сортировал вектор структур. Получалось и коротко, и наглядно.
тут уже все много описали, так что я бы только добавил, что в с++11 есть еще и std::array, но применение его сомнительно в твоей ситуации (2^20 ~~~ 10^6 элементов)
Оставить комментарий
darin06
Столкнулся с такой задачей. Есть два одномерных массива, хочется отсортировать их связаным образом, в порядке возрастания значений элементов первого. Я придумал построить list из векторов (vector каждый вектор состоит из элемента первого и соответсвующего элемента второго массива. Поместить элементы массивов в лист у меня получилось, а вот как отсортировать лист по первым элемента векторов не знаю (потом еще удалиить повторяющиеся по первому элементу). Разъясните как такое можно сделать. Да, по производительности не критично.