[英]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.assign和C ++ 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.