#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);
});