Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 向量下标超出范围(但不是真的)_C++_Runtime Error_Stdvector_Subscript - Fatal编程技术网

C++ 向量下标超出范围(但不是真的)

C++ 向量下标超出范围(但不是真的),c++,runtime-error,stdvector,subscript,C++,Runtime Error,Stdvector,Subscript,我使用一个函数来填充向量,使用双倍值进行随机模板测试: template <typename T> void setList(vector<T> & theList) { srand(time(NULL)); int howMany, max, min; cout << "How many items should be generated in the li

我使用一个函数来填充向量,使用双倍值进行随机模板测试:

    template <typename T>
    void setList(vector<T> & theList)
    {
        srand(time(NULL));          

        int howMany, max, min;
        cout << "How many items should be generated in the list? ";
        cin >> howMany;
        cin.ignore();

        cout << "Max value of list? ";
        cin >> max;
        cin.ignore();

        cout << "Min value of list? ";
        cin >> min;
        cin.ignore();

        theList.resize(howMany);

        T randValue;
        for (int i = 0; i < howMany; ++i)
        {
            randValue = (((double) rand() / (double) RAND_MAX) * (max - min)) + min;
            theList[i] = randValue;
        }
    }
错误被抛出


有什么想法吗?

我在Solaris环境中尝试过这段代码,但没有出现超出范围的索引异常

这是我的代码:

 template <typename T>
 void setList(std::vector<T> & list)
 {
    srand(time(NULL));

    int howMany, max, min;
    std::cout << "How many items should be generated in the list? ";
    std::cin >> howMany;
    std::cin.ignore();

    std::cout << "Max value of list? ";
    std::cin >> max;
    std::cin.ignore();

    std::cout << "Min value of list? ";
    std::cin >> min;
    std::cin.ignore();

    list.resize(howMany);

    T randValue;
    for (int i = 0; i < howMany; ++i)
    {
       randValue = (((T) rand() / (T) RAND_MAX) * (max - min)) + min;
     list[i] = randValue;
    }
    // I Have added this feature for visualization purposes
    for (int i = 0; i < list.size(); ++i)
    {
       std::cout << "list[" << i << "]=" << list[i] << std::endl;
    }
  }
我的主菜看起来像

 int main(int argc, char** argv) {
     std::vector<int> lista;
     lista.clear();
     setList(lista);
 }
我的输出是:

顺便说一句,我注意到如果你定义一个整数向量,向量的内容总是最小值。这是因为您需要将中间值转换为double,并最终将结果转换为T类型。在intege类型中,/运算符被解释为整数除法

你可以这样做

 for (int i = 0; i < howMany; ++i)
 {
     randValue = static_cast<T>((static_cast<double>((T) rand()) / static_cast<double>((T) RAND_MAX)) * (max - min)) + min;
     list[i] = randValue;
 }

@SingerOfTheFall为我的困境提供了答案

具体地说,在本例中,调试时出现一个无意义的错误,即超出范围而实际上在范围内,需要测试不同的途径

如果在不同的编译器中加载显示代码运行良好,那么问题不一定与代码有关


在这种情况下,从头开始重新编译代码并清理代码就达到了目的。

这可能是因为list也是一个STD类吗?为什么你使用模板方法,因为你的向量按定义保存整数,不是吗?也许添加list.reservehowMany可以解决这个问题。@402,是的,我也考虑过这个问题。但是,这很奇怪,因为如果新大小大于以前的大小,vector::resize应该正确创建新元素。不过,OP值得一试。也许可以尝试使用at而不是[],并在发布模式下编译以检查?@402调用reserve怎么能解决任何问题?我还没有发现整数的错误,谢谢你指出这一点!多亏了你。当做
 int main(int argc, char** argv) {
     std::vector<int> lista;
     lista.clear();
     setList(lista);
 }
 for (int i = 0; i < howMany; ++i)
 {
     randValue = static_cast<T>((static_cast<double>((T) rand()) / static_cast<double>((T) RAND_MAX)) * (max - min)) + min;
     list[i] = randValue;
 }