vector::_M_range_check exception
vector::_M_range_check exception
我想实现一些排序算法来比较它们,但我遇到了一个奇怪的异常。
这是我排序的代码:
//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 << " ";
}
相关文章:
- CHECK(调用)函数在Google Colab中出错
- 为重写std::exception的库生成swig接口时出错
- 什么是 std::exception::what() 以及为什么要使用它?
- 链表"exception thrown"
- 为什么程序员同时使用 std::bad_alloc 和 std::exception.是否 std::例外 仅是不够的
- 'make check' GLIBC 运行时的链接问题
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- C++ broken_promise exception
- 请参阅在 Visual Studio 2019 中捕获 std::exception 时对函数模板实例化消息的引用
- QVTKWidget SetRenderWindow() with PCLVisualizer Exception
- 自定义派生的 std::exception 类的 'what' 函数返回神秘的废话
- 使用flag、return、exception、goto或break中止过程
- 由于某种原因,我的代码中出现了 [json.exception.type_error.302]。我知道错误意味着什么,但我不知道哪里有故障
- 派生自 std::exception 的类的赋值运算符
- rpmbuild check-rpath 报告错误,指出路径不是绝对的,不正确的
- 尝试打印字符串时"Python Exception <class 'gdb.error'> There is no member named _M_dataplus."
- std::exception :使用虚函数和继承与变量
- MFC ODBC SQLConfigDataSource() Unhandled Exception
- 调用 dll 函数时"Run-Time Check Failure #0 - The value of ESP"
- c++ Inline Function throw Exception: Run-Time Check Failure