【问题标题】:C++ accessing vectorC++ 访问向量
【发布时间】:2010-11-22 15:34:31
【问题描述】:

我有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

【问题讨论】:

  • 这段代码不会为我编译。你确定tmp 这里的设置是你的实际代码吗?当我修复它以在vector 中设置3 个strings 时,此代码运行良好。
  • 使用更新的代码,我看不出有任何失败的原因。您在此处编写的代码是否会为您崩溃?

标签: c++ vector std


【解决方案1】:

您使用的是哪个编译器?我真的很惊讶std::vector&lt;std::string&gt; tmp("1","2","3"); 甚至编译!

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

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

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

【讨论】:

  • 我相信这是编造的代码。如果他输入vector&lt;string&gt; tmp("1", "2");,它会编译,但它并没有达到预期的效果。
  • 那不是我的实际代码。我这样做是为了澄清意思。我会解决的。
【解决方案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

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

您的问题的解决方案是:

a) 将 vec[i] 替换为 vec.at(i) - 工作相同(嗯,一点点慢一点,但你不会感觉到),你很安全。

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

您可能会通过这种方式快速找到您的错误。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我发现了问题。它在处理向量大小的函数中。显然向量是空的。愚蠢的错误。谢谢大家的解答。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-06-07
        • 2021-12-28
        • 2018-11-05
        • 1970-01-01
        • 2012-08-28
        相关资源
        最近更新 更多