why sort function of STL is not working?

十年热恋 提交于 2021-02-10 12:41:03

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!