繁体   English   中英

C ++访问向量

[英]C++ accessing vector

我有std::vector ,它包含我自己的类,我必须访问它的功能和空隙。

class A
{
private: 
     int var;
     vector<string> vec;

public:
     void setVar(int i) { var = i; }
     void setVec(vector<string> a) { vec = a; }
};

我也有返回函数,但是我没有打扰他们。 而且我已经包含了所有必要的文件。

int main()
{
    vector<A> vec;
    for (int i = 0; i < 10; i++)
    {
        A tmp;
        tmp.setVar(i);
        vec.push_back(tmp);
    }

    for (int i = 0; i < 10; i++)
    {
        vector<string> tmp;
        tmp.push_back("1");
        tmp.push_back("2");
        tmp.push_back("3");
        vec.at(i).setVec(tmp);  //Works sometimes or causes error std::out_of_range
        vec[i].setVec(tmp);     //Crashes the whole programm
    }
}

那么既然vector已初始化,如何设置这些变量?

我正在使用g ++,这不是实际的代码,因为我的实际代码很乱。

Error for vec.at(i).setVec(tmp);
Error is:  terminate called after throwing an instance of 'std::out_of_range'
  what():  vector::_M_range_check

您正在使用哪个编译器? 我真的很惊讶std::vector<std::string> tmp("1","2","3"); 甚至编译!

老实说,我不知道它叫什么,但我敢打赌,它没有达到您的期望,我相信是:

std::vector<std::string> tmp;
tmp.push_back("1");
tmp.push_back("2");
tmp.push_back("3");

作为记录, boost.assignC ++ 0x提供了您尝试实现的那种容器初始化。

您发布的代码仍然无法编译(在第一个循环中未声明tmp ),因此让我大致解释一下会发生什么。

您提到了两种错误:

vec.at(i).setVec(tmp);  //Works sometimes or causes error std::out_of_range

该函数at尝试是安全的-它首先检查向量的长度,然后返回给定索引的元素,或者抛出std::out_of_range如果载体不含有这样的索引的元素。

第二种情况:

vec[i].setVec(tmp);     //Crashes the whole programm

运算符[]行为与矢量的at()函数非常相似,但它不“安全”,因为它不进行任何边界检查。 因此,如果您尝试访问3元素的4元素,则只需访问内存中的某个随机位置(例如,可以是另一个不相关的变量,可以是其他任何东西)。 如果幸运的话,您的程序将在此之后崩溃。 如果您不走运,则会遇到内存损坏问题和非常奇怪的错误,很难找到。

您的问题的解决方案是:

a)更换vec[i]vec.at(i) -工作一样(当然, 一点点慢,但你不会觉得),你是安全的。

b)然后:在实际执行此向量查找时查看所有位置,并在每个位置停下来一秒钟,然后考虑:“此向量此刻有多大?我确定该索引的元素存在吗?”。

您可能会以这种方式快速找到错误。

我在VS2010中尝试了您的代码,但无法重现您描述的问题。 当然,按值传递向量不是一个好主意,它应该是对常量的引用,但它不会导致这种错误。 考虑到出现了'std :: out_of_range'的事实,最可能的原因是向量中没有具有该索引的元素。 为了进行测试,您可以在访问vec[i] (或vec.at(i) )之前检查i < vec.size()是否

我发现了问题。 它在功能上处理了矢量的大小。 显然载体是空的。 愚蠢的错误。 谢谢大家的回答。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM