我正在使用一个函数用随机模板值填充向量(使用双精度测试):

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


该函数主要在向量上调用:

    vector<double> listA;
    setList(listA);


无论“ howMany”的值是多少,当我到达下标howMany-2时,我都得到下标超出范围的错误。

单步调试器,我的索引在下标范围内。

例如,如果用户输入10作为howMany,则在循环尝试输入时

theList[8] = 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;
    }
  }


我的main()看起来像

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


我的输出是:



顺便说一句,我注意到,如果您定义一个整数向量,则向量的内容始终是最小值。这是因为您需要将中间值转换为双精度值,最后将结果转换为类型T。(在整数类型中,“ /”运算符被解释为整数除法)。

你可以做到这一点。

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

关于c++ - vector 下标超出范围(但不是真的),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23261069/

10-11 23:12
查看更多