【问题标题】:using vectors with qsort()使用带有 qsort() 的向量
【发布时间】:2023-03-19 05:38:01
【问题描述】:

我正在做一个涉及使用 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
}

【问题讨论】:

  • 当我运行调试器时,它说它无法打开 PDB 文件。我从未听说过 PDB 文件

标签: c++ vector qsort


【解决方案1】:

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

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

如果您的分区有 1 个元素,您需要处理特殊情况

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

    • 我应该使用 qsort。这是我的作业,教授说使用 qsort 是强制性的。
    • 您是在使用 C++ 中的库还是在构建自己的快速排序例程?
    猜你喜欢
    • 2016-11-10
    • 2011-12-02
    • 2014-08-09
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-31
    相关资源
    最近更新 更多