循环向量不起作用::向量下标超出范围[重复]

Posted

技术标签:

【中文标题】循环向量不起作用::向量下标超出范围[重复]【英文标题】:Vector for loop isn't working:: vector subscript out of range [duplicate] 【发布时间】:2017-10-08 16:21:51 【问题描述】:

这里的目标 == 我正在尝试将字符串值 push_back 到向量中......出现诸如(向量下标超出范围)之类的问题

我已经创建了一个接受字符串向量作为参数的函数

我在该函数中创建了一个 for 循环,利用一个变量与一个 'cin' 函数相结合

我得到的只是'向量下标超出范围'......如何?我错过了什么吗?

    #include <iostream>
    #include <vector>
    #include <string>


    void sentDef(std::vector <std::string> sentienceVar) 

        std::string terms;

        std::cout << "input how many terms/variables made" << std::endl;
        int howManyVar;
        std::cin >> howManyVar;

        for (int i = 0; i < howManyVar; i++) 
            std::cin >> terms;
            sentienceVar.push_back(terms);
        
    

    int main() 

        std::vector <std::string> sentienceVar;
        sentDef(sentienceVar);

        std::cout << sentienceVar[0] << std::endl;

        system("pause");

    

【问题讨论】:

Read a good beginners book or two,并了解按值传递参数或按引用传递参数的区别。 如果您要更改作为参数传递给函数的任何内容,请通过引用传递。 【参考方案1】:

改变这个:

void sentDef(std::vector <std::string> sentienceVar)

到这里:

void sentDef(std::vector <std::string>& sentienceVar)

现在您的向量通过引用传递,因此保留了对其所做的更改。

在您的代码中,它是按值传递的(因此它的一个副本被传递给函数。该函数对该副本进行操作,并且在该函数的末尾,该副本超出了范围)。

【讨论】:

大声笑当然xD总是那些小错误......现在这让我更认真地对待我的老师,因为他们说一些最大的错误可能是我们忽略的最小的事情哈哈 @thundergawd 你应该听到你的老师的声音! @gsamaras 请停止回答这些离题问题。他们有一个密切的原因。也更好地了解骗子!【参考方案2】:

要扩展@gsamars,请在谷歌上通过复制和引用传递参数。

您在函数中所做的是接受向量的副本,因此当函数返回时原始sentiencevar 为空!

在类型之后添加 & 告诉编译器您要通过引用传递,因此您创建的函数会影响原始向量。请注意,这也比创建副本更快。

【讨论】:

我知道,它只是被忽视得太严重了,没有意识到这一点,有点像我们有时会忘记';'在某行的末尾。谢谢

以上是关于循环向量不起作用::向量下标超出范围[重复]的主要内容,如果未能解决你的问题,请参考以下文章

错误向量下标超出范围

C ++:当尝试在单个for循环中使用getlline()填充多个向量时,向量下标超出范围

(opencv) 调试断言失败,向量下标超出范围

二维向量下标超出范围

opencv图像处理,向量下标超出范围

调试断言失败,向量下标超出范围