Почему я получаю ошибку std ::out_of_range?

#c #c 11

#c #c 11

Вопрос:

Я пытаюсь создать функцию, которая переупорядочивает элементы вектора, если он не находится в порядке возрастания. Я написал это, но когда я его компилирую, я получаю:

завершение вызывается после создания экземпляра ‘std:: out_of_range’ what(): vector::_M_range_check

Может кто-нибудь сказать мне, что не так с моей функцией? Спасибо.

 void reorder(vector<double>amp; orderA)
{
    for (unsigned int i = 0; i < orderAngle.size();   i)
    {
        temp = orderA.at(i);
        orderA.at(i) = orderA.at(i 1);
        orderA.at(i 1) = temp;
    }

    return;
}
  

Комментарии:

1. i 1 находится вне диапазона, когда i = orderAngle.size() — 1 . Кроме того, код не выполняет то, что должен. Вам нужна полноценная функция сортировки.

2. Когда ваш счетчик будет равен size -1 , он попытается получить последний элемент и следующий, которого не существует. Ваша функция цикла должна быть i < orderAngle.size() -1

3. Вряд ли это auto temp = orderA.at(0); orderA.erase(orderA.begin()); orderA.push_back(temp); будет более эффективно?

4. @OlegAndriyanov: return оператор не требуется для функций, которые имеют void возвращаемый тип.

5. Функция также не будет повторяться вечно, если не указано требуемое значение возврата. Это может повторяться вечно, но также может привести к повреждению стека, прямому сбою или съесть кошку вашего соседа. Иногда он может даже вести себя так, как вы ожидаете, а не другие.

Ответ №1:

1- Как упоминалось в комментариях Олжаса, ваш код выйдет за пределы диапазона, когда i станет равным orderAngle.size() , поэтому вам нужно изменить цикл for на:

 for(unsigned int i = 0; i < orderAngle.size() - 1;   i)
  

2- Ваш алгоритм не достигает того, чего вы хотите достичь.

3- Вам действительно нужно написать свой собственный алгоритм для сортировки вектора удвоений? Как насчет использования чего-то вроде следующего кода:

 sort(vec.begin(), vec.end(), [](double x, double y) {

   return (x < y);
});