使用带qsort的向量()

时间:2013-03-14 00:06:02

标签: c++ vector qsort

我正在做一个涉及使用qsort()的向量的家庭作业。我能够获得编译的代码,但是我收到错误说Expression: vector subscript is out of rangeExpression: Standard C++ Libraries out of range &&0任何人都可以帮助我的向量下标超出范围的位置和原因吗?

#include    <iostream>
#include    <fstream>
#include    <iomanip>
#include    <string>
#include    <vector>

using namespace std;

#include    "functions.h"

typedef vector< int >::size_type size_t;


int main( )
{
    ifstream ifs = get_ifs( );

    sort( ifs );

    return 0;
}


void sort( ifstream &ifs )
{
    vector< int > vi;
    int value;

    while( ifs >> value )
    {
        vi.push_back( value );
    }

    cout << "unsorted vi:\n" << vi << '\n';

    qsort( vi );

    cout << "\nsorted vi:\n" << vi << '\n';
}


void qsort( vector< int > &vi )
{
    int bot = 0;
    int top = vi.size() - 1;

    qsort(vi, bot, top);
}

void qsort( vector< int > &vi, size_t low, size_t high )
{


    if (low < high)
    {
        int split = partition(vi, low, high);
        qsort(vi, low, split-1);
        qsort(vi, split+1,high);
    }
    else
    {
        return ;
    }

}

size_t partition( vector<int>& vi, size_t low, size_t high )
{
    int pivot = vi[high];
    int bottom = low - 1;
    int top = high;

    bool notdone = true;
    while(notdone)
    {
        while(notdone)
        {
            bottom += 1;
            if (bottom == top)
            {
                notdone = false;
                break;
            }
            if (vi[bottom] > pivot)
            {
                vi[top] = vi[bottom];
                break;
            }
        }
        while (notdone)
        {
            top = top-1;

            if (top == bottom)
            {
                notdone = false;
                break;
            }
            if (vi[top] < pivot)
            {
                vi[bottom] = vi[top];
                break;
            }
        }
    }
    vi[top] = pivot;
    return top;
}





void print_vec( const vector< int > &vi, size_t n, size_t t )
{
    cout << vi;

    for( size_t i = 0; i < t; ++i )
    {
        cout << setw( 3 ) << vi[ i ] << ' ';
    }

}


ostream &operator <<( ostream &out, const vector< int > &vi )
{
    vector< int >::const_iterator iter;

    for( iter = vi.begin( ); iter != vi.end( ); ++iter )
    {
        out << setw( 3 ) << *iter << ' ';
    }

    return out;
}


ifstream get_ifs( )                             // get input file stream
{
    string filename;                            // input file name

    cerr << "name of file to read from? ";
    cin  >> filename;

    ifstream ifs( filename, ifstream::in );
    if( ! ifs )                                 // cannot open file infilen
    {
        cerr << "cannot open input file '" << filename << "'\n";
        exit( 1 );
    }

    return ifs;                                 // return input file stream
}

2 个答案:

答案 0 :(得分:3)

当您对元素进行分区,直到每个分区中只剩下1个元素时,如果我理解正确,您将返回0作为顶部。

当您点击代码qsort(vi, low, split-1);时,分割将包含0。

你需要对待你的分区有1个元素的特殊情况

答案 1 :(得分:0)

不要在C ++中使用qsort。如果可能的话,使用std :: sort()。

问题是您传递给qsort的基础不是vi而是&amp; vi [0],因为容器可能有其他数据来管理向量。

另请查看Using qsort() with class pointers以获取更多答案和解释。