Доброго времени суток. :)
Возможно Вам покажется, что я - один из суперменов или идиотов, но всё же хочется задать такой вопрос:
Почему в GCC может не компилироваться сей код?
#include <vector>
#include <algorithm>
using namespace std;
typedef pair < pair < double, double > , pair < int , int > > WHAT_A_MAD_TYPE1111;
typedef WHAT_A_MAD_TYPE1111 my;
bool my_compare ( my & A, my & B )
{
return true;
}
int main()
{
vector < my > sorted;
sort( sorted.begin(), sorted.end(), my_compare );
return 0;
}
В 2005 студии же компилируется нормально.
Компилятор сообщает нам следующее:
Can't compile program.cpp:
In file included from c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/algorithm:62,
from program.cpp:2:
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h: In function 'const _Tp& std::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = std::pair<std::pair<double, double>, std::pair<int, int> >, _Compare = bool (*)(my&, my&)]':
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:2301: instantiated from 'void std::__introsort_loop(_RandomAccessIterator, _RandomAccessIterator, _Size, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<std::pair<std::pair<double, double>, std::pair<int, int> >*, std::vector<std::pair<std::pair<double, double>, std::pair<int, int> >, std::allocator<std::pair<std::pair<double, double>, std::pair<int, int> > > > >, _Size = int, _Compare = bool (*)(my&, my&)]'
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:5258: instantiated from 'void std::sort(_RAIter, _RAIter, _Compare) [with _RAIter = __gnu_cxx::__normal_iterator<std::pair<std::pair<double, double>, std::pair<int, int> >*, std::vector<std::pair<std::pair<double, double>, std::pair<int, int> >, std::allocator<std::pair<std::pair<double, double>, std::pair<int, int> > > > >, _Compare = bool (*)(my&, my&)]'
program.cpp:16: instantiated from here
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:124: error: invalid initialization of reference of type 'my&' from expression of type 'const std::pair<std::pair<double, double>, std::pair<int, int> >'
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:125: error: invalid initialization of reference of type 'my&' from expression of type 'const std::pair<std::pair<double, double>, std::pair<int, int> >'
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:127: error: invalid initialization of reference of type 'my&' from expression of type 'const std::pair<std::pair<double, double>, std::pair<int, int> >'
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:131: error: invalid initialization of reference of type 'my&' from expression of type 'const std::pair<std::pair<double, double>, std::pair<int, int> >'
c:\compiler\mingw\bin\../lib/gcc/mingw32/4.4.1/include/c++/bits/stl_algo.h:133: error: invalid initialization of reference of type 'my&' from expression of type 'const std::pair<std::pair<double, double>, std::pair<int, int> >'
Заранее спасибо.
Возможно я что-то путаю, но если засылать мы будем не ссылки, то, если в качестве аргументов у нас будет что-то огромное...
Короче, отведённое на копирование время... и время работы программы печально возрастёт.
Буду рад, если ошибаюсь.
Тем не мене MSVS 2005 = compile OK
- n <= 3: разбираем 6 случаев ручками
- qsort.
- Если qsort ушел слишком глубоко - запускаем HeapSort.
In the worst case, up to N2, depending on specific sorting algorithm used by library implementation.Если вы сдавали на VC++ - то не очень удивлён.Если на GCC - удивлён очень сильно. Обогнать std::sort пытался "чистым" qsort/mergesort, у меня не получилось. Даже в самом лучшем случае.С каких пор компилятор в студии стал хуже чем GCC О.О
Разумеется, в студии сортировка гарантированно за N*log(N)
А еще я где-то слышал, что по совместимости со стандартами компиляторы располагаются так: Borland C++, GCC, VC++
std::sort не может ловить TLE.
(дважды запостилось)
bool my_compare ( my & A, my & B )
на
bool my_compare (const my & A, const my & B )
ведь нехорошо же, когда компаратор изменает данные? :)
+1
Да, совсем нехорошо...
Получается что может быть что A < B и в тоже время B < A. Это вообще должно выбрасывать исключение при сортировке..
кладу в set и обратно вытаскиваю уже в отсортированном виде. Точно за nlong будет.
for(set<int>::iterator it=s.begin();it!=s.end();it++)
{
//и тут с (*it) работаешь
}
лишь бы память позволяло...
Надо ещё не забывать про stable_sort().