2010-11-22 84 views
2

我有std::vector它包含我自己的类,我必须访问它的函数和空白。C++访问向量

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 
+0

这段代码不会为我编译。你确定这里`tmp`的设置是你的实际代码吗?当我解决这个问题时,要做一些有效的工作来在`vector`中设置3个`string`,这段代码运行良好。 – 2010-11-22 15:45:56

+1

使用更新的代码,我没有看到任何理由,这应该失败。您写的代码是否会为您崩溃? – 2010-11-22 16:37:37

回答

2

您正在使用哪种编译器?我其实很惊讶,即使编译也是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提供了一种您试图实现的容器初始化。

2

您发布的代码仍然无法编译(在第一个循环中没有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 

操作[]行为很像0​​功能的载体,但它不是“安全”的,因为它没有做任何边界检查。因此,如果您尝试访问3元素的第4个元素,则只需访问您内存中的某个随机位置(可能是另一个无关的变量,例如可能是其他任何内容)。如果你很幸运,那么你的程序会在那之后崩溃。如果你不走运,你会遇到内存损坏问题和很奇怪的错误,很难找到。

你的问题的解决方案是:

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

b)然后:看看所有的地方,当你实际做这个矢量查找,并在每一个地方停下来,考虑:“这个矢量在这个时候有多大?我确定这个指数的元素存在?”。

你很可能以这种方式快速找到你的bug。

1

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

0

我发现问题。它是处理矢量大小的函数。显然矢量是空的。愚蠢的错误。谢谢大家的回答。