vector::_M_range_check exception

vector::_M_range_check exception

本文关键字:exception check vector range      更新时间:2023-10-16

我想实现一些排序算法来比较它们,但我遇到了一个奇怪的异常。

这是我排序的代码:

//InsertionSort.hpp
#ifndef SORT_INSERTIONSORT_HPP
#define SORT_INSERTIONSORT_HPP
#include <vector>
class InsertionSort
{
public:
    explicit InsertionSort(std::vector<int> v) : m_vector(std::move(v)){};
    ~InsertionSort() {};
    std::vector<int> save() const;
    void execute();
protected:
    void sort();
private:
    std::vector<int> m_vector;
};
#endif //SORT_INSERTIONSORT_HPP

//InsertionSort.cpp
#include <stddef.h>
#include "InsertionSort.hpp"
std::vector<int> InsertionSort::save() const
{
    return m_vector;
}
void InsertionSort::execute()
{
    sort();
}
void InsertionSort::sort()
{
    int x;
    size_t j;
    for (size_t i = 1; i < m_vector.size(); ++i)
    {
        x = m_vector[i];
        j = i;
        while ((j > 0) && (m_vector[j - 1] > x))
        {
            m_vector[j] = m_vector[j - 1];
            --j;
        }
        m_vector[j] = x;
    }
}

以及主要功能

#include <iostream>
#include <random>
#include <vector>
#include <chrono>
#include <memory>

#include "Sorting/InsertionSort.hpp"
int main()
{
    /* random numbers generation  */
    std::mt19937_64 random(std::chrono::system_clock::now().time_since_epoch().count());
    std::uniform_int_distribution<int> distribution(0, 1000);
    std::vector<int> vec;
    for(auto i = 0; i < 100; ++i)
    {
        vec.push_back(distribution(random));
    }
    /* actual sorting */
    std::unique_ptr<InsertionSort> is(new InsertionSort(std::move(vec)));
    is->execute();
    auto result = is->save();
    for(const auto &it : result)
    {
        try
        {
            std::cout << result.at(it) << " "; //here exception appears
        } catch(std::out_of_range exc)
        {
            std::cout << exc.what() << std::endl;
        }
    }
    std::cout << std::endl;
    return 0;
}

当我尝试显示已排序的向量时,会引发异常。当我逐行调试这个代码时,vector包含100个元素,直到我想要打印出vector内容的循环。

result.at(it)将在it的索引处显示矢量的元素。如果it>=size(),则at()将抛出异常。要打印出矢量的内容,只需使用

for(const auto &it : result)
{
    std::cout << it << " ";
}

这将按向量中的每个元素的顺序输出向量中的每一个元素。

正如我在评论中提到的,您根本不需要在代码中使用std::unique_ptr。你可以简单地使用

//...
InsertionSort is(std::move(vec));
is.execute();
auto result = is.save();
//...

您对向量的迭代不正确。

两种可能的解决方案:

1.

for (size_t i = 0; i < result.size(); ++i)
{
    std::cout << result.at(i) << " "; //i - is an index
}

2.

for(const auto &value : result)
{
    std::cout << value << " ";
}