问题
A set of numbers will be passed as input. Also the redefined relationship of the digits 0-9 in ascending order will be passed as input. Based on the redefined relationship, the set of numbers must be listed in ascending order. Sample I/O
Input:
20 50 11 121
9231476058
Output:
50 11 20 121
The program which i wrote having an error about which i am not aware of. so, please help me in debugging it.
Program specification:
1.) I created one adjacency list for grouping the numbers on the basis of their number of digits(50 11 20 grouped at index 2 and 121 at index 3)
2.)For sorting them i have used standard template library sort function. I have passed the following parameters
list<int> *lst=new list<int>[10]; //adjacency list
void sortg(list<int> *lst,int *arr1)
{
static int *arr=arr1;
struct fnct
{
int digi;
fnct(int digi)
{
this->digi=digi;
}
bool operator()(int val1,int val2)
{
while(digi>0) // is the number of digits of the passed arguments
{
//logic for sorting. here i have used local arry "*arr" which i
//have declared static
}
}
};
for(int con=9;con>=0;--con) //count for the rows of adjacency list
{
if( (*(lst+con)).size()>0 ) // for finding out a valid list
{
sort((lst+con)->begin(),(lst+con)->end(),fnct(con));
}
}
}
The error which i got is:
In file included from /usr/include/c++/4.9/algorithm:62:0,from prog.cpp:5:
/usr/include/c++/4.9/bits/stl_algo.h: In instantiation of 'void
std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with
_RandomAccessIterator = std::_List_iterator<int>; _Compare =
__gnu_cxx::__ops::_Iter_comp_iter<sortg(std::list<int>*, int*)::fnct>]':
/usr/include/c++/4.9/bits/stl_algo.h:4716:78: required from 'void
std::sort(_RAIter, _RAIter, _Compare) [with _RAIter =
std::_List_iterator<int>; _Compare = sortg(std::list<int>*, int*)::fnct]'
prog.cpp:124:63: required from here
/usr/include/c++/4.9/bits/stl_algo.h:1968:22: error: no match for 'operator-
' (operand types are 'std::_List_iterator<int>' and
'std::_List_iterator<int>')
std::__lg(__last - __first)
*2,/usr/include/c++/4.9/bits/stl_algo.h:1968:22: note:
'std::_List_iterator<int>' is not derived from 'const
std::move_iterator<_Iterator>'
std::__lg(__last - __first) * 2,
"Lines are removed from here"
^
In file included from /usr/include/c++/4.9/vector:65:0,
from /usr/include/c++/4.9/bits/random.h:34,
from /usr/include/c++/4.9/random:49,
from /usr/include/c++/4.9/bits/stl_algo.h:66,
from /usr/include/c++/4.9/algorithm:62,
from prog.cpp:5:
/usr/include/c++/4.9/bits/stl_bvector.h:208:3: note: std::ptrdiff_t std::operator-(const std::_Bit_iterator_base&, const std::_Bit_iterator_base&)
operator-(const _Bit_iterator_base& __x, const _Bit_iterator_base& __y)
^
/usr/include/c++/4.9/bits/stl_bvector.h:208:3:
note:no known conversion for argument 1 from 'std::_List_iterator<int>' to
'const std::_Bit_iterator_base&'
Since this error is lengthy i have removed some lines from in between of it
回答1:
The error in line
sort((lst+con)->begin(),(lst+con)->end(),fnct(con));
says
In instantiation of 'void
std::__sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with
_RandomAccessIterator = std::_List_iterator<int>; _Compare =
__gnu_cxx::__ops::_Iter_comp_iter<sortg(std::list<int>*, int*)::fnct>]'
Now, List is built as a doubly linked list (hence iteration in both directions) with its primary feature being the support for constant time insert and erase operations. But Random Access ? No.
So, the error message says that sort needs RandomAccessIterator which List Iterator isn't (It is Bidirectional iterator which is expected as list is implemented as a doubly linked list).
So, use the member function sort to do this.
(*(lst+con).)sort(fnct(con)); // Use it as appropriate
来源:https://stackoverflow.com/questions/30965367/why-sort-function-of-stl-is-not-working