尝试对对象数组进行排序时程序终止

时间:2018-05-10 12:00:33

标签: c++ arrays sorting

我有class名为ContactInfo,结构如下:

class ContactInfo
{
    private:
        string contactName;
        string contactNumber;

        public:
            ContactInfo()
            {
                contactName = "";
                contactNumber = "";
            }
            //setter and getters
};

我有一个创建ContactInfo数组的函数,并通过用户输入填充它。填充数组后,它将被传递给另一个对它进行排序的函数,所述函数编写如下所示。

void sortListByName(ContactInfo contactList[], int listSize)
{
    for(int i = 0; i < listSize; i++)
    {
        for(int j = i+1; j < listSize+1; j++)
        {
            if(contactList[i].getContactName() > contactList[j].getContactName())
            {
                ContactInfo temp = contactList[j];
                contactList[i] = contactList[j];
                contactList[j] = temp;
            }

        }
    }
}

主要方法

int main()
{
    ...

    int n;//array size
    ContactInfo *newList = contactList(n);//populates the array.
    sortListByName(newList, n);

    ...
}

问题是程序会在排序发生之前终止并产生错误:

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.
terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid

1 个答案:

答案 0 :(得分:3)

您的错误是在最后一次迭代中的排序算法中产生的。 问题是,在第一个for循环变量i中从0变为listSize, 在第二个for循环变量j从i + 1变为listSize + 1。当变量i到达listSize-1时,变量j将从第二个for循环中的i + 1开始。这意味着j = listSize,然后当您尝试访问contactList [j]时,将发生错误,因为contactList的元素从索引0开始并以索引listSize-1结束。

void sortListByName(ContactInfo contactList[], int listSize)
 {
    for(int i = 0; i < listSize; i++)  //it should be for(int i=0;i<listSize-1;i++)
    {
       //here is your mistake. When i = listSize-1 then j=listSize and
      // that index is out of range.
       for(int j = i+1; j < listSize+1; j++) //it should be for(int j=i+1;j<listSize;j++)
       {
        if(contactList[i].getContactName() >     contactList[j].getContactName())
        {
            ContactInfo temp = contactList[j];
            contactList[i] = contactList[j];
            contactList[j] = temp;
        }

    }
}
}

这就是你的代码的样子:

void sortListByName(ContactInfo contactList[], int listSize)
{
    for(int i = 0; i < listSize-1; i++)
    {
       for(int j = i+1; j < listSize; j++)
       {
            if(contactList[i].getContactName()>   contactList[j].getContactName())
            {
                ContactInfo temp = contactList[j];
                contactList[i] = contactList[j];
                contactList[j] = temp;
            }

     }
 }