矢量.push_back

Posted

技术标签:

【中文标题】矢量.push_back【英文标题】:vector.push_back 【发布时间】:2013-02-20 03:40:00 【问题描述】:

我正在编写一个从给定格式的数据文件中读取数据的应用程序。在文件中,我动态地创建了一个指向向量对象的二维指针数组。基本上,它会读取文件,当它找到给定的字符串模式时,它会停止并读取

while(getline(inputFile,tempTestString))
        // first for ACCEL
        if(string::npos != tempTestString.find(ACCEL))
            sstream.str(tempTestString);
            sstream >> pushBack;
            cout << "position 1" << endl;
            array[tempDim1][tempDim2].vectorName->push_back(pushBack);
            cout << "position 2" << endl;
            break;
        

现在,pushBack 是一个很大的数字,可能高达 20000,但它因文件而异。

这段代码的问题是我没有收到任何运行时错误,甚至没有抛出任何异常,我尝试捕获它们。程序简单结束!可以肯定的是,我添加了 cout &lt;&lt; "position1" &lt;&lt; endl;cout &lt;&lt; "position2" &lt;&lt; endl; 行以及后面的打印。

如果你没有猜到:

tempTestStringACCEL - 字符串对象

sstream - 字符串流对象

array - 动态内存中的二维结构数组

vectorName - 指向向量对象的指针,array 指向的结构成员

附录:

因此,针对某些 cmets,这里是代码的另一部分,其中创建了所有变量:

数组

array = new structName* [tempDim1];
for(int i = 0; i < tempDim2; i++)
    array[i] = new structName [tempDim2];

结构名称

struct structName
    vector<double>* vectorName;
    vector<double>* vectorName1;
    vector<double>* vectorName2;
 ;

tempDim1 和 tempDim2 都是 const ints,值分别为 2 和 3。 pushBack 的值最高可达 20000

【问题讨论】:

那么像cout &lt;&lt; "position 1" &lt;&lt; endl; 这样的语句没有产生任何输出? cout 确保 array[tempDim1][tempDim2].vectorName 有效。 这引出了 Grigoriy 刚刚指出的问题? everything 指出array[tempDim1][tempDim2].vectorName-&gt;push_back(pushBack); 是问题所在,除了简短的描述之外,没有我们对此一无所知。既然您无论如何都在打印cout,那么为了让您的仪器更加清晰,如何转储所有这些索引和pushBack 我稍后会发布一个附录 【参考方案1】:

尝试纠正这个问题:

array = new structName* [tempDim1];
for(int i = 0; i < tempDim2; i++)
    array[i] = new structName [tempDim2];

=>

array = new structName* [tempDim1];
for(int i = 0; i < tempDim1; i++)
    array[i] = new structName [tempDim2];

【讨论】:

谢谢大家。我在复制代码时犯了一个错误,但是当我在结构中删除指向 vectorName 的指针时,它起作用了。谁能告诉我为什么它不起作用? 当出现越界错误时,C++ 程序的行为是未定义的(不像 JAVA 会抛出异常)。你根本不知道会发生什么。【参考方案2】:

您在初始化中使用了错误数量的元素。

array = new structName* [tempDim1];
for(int i = 0; i < tempDim2; i++)
    array[i] = new structName [tempDim2];

i &lt; tempDim2 错误;该数组有 tempDim1 个元素。

我不知道这是不是的问题,但这是一个的问题。如果 tempDim1 > tempDim2 则 array[] 的某些元素将未初始化。 (如果反过来,你正在破坏内存。)唯一可行的方法是如果 tempDim1 和 tempDim2 巧合相同。

【讨论】:

以上是关于矢量.push_back的主要内容,如果未能解决你的问题,请参考以下文章

矢量 push_back 非常慢

调整对象矢量大小时出错

修改矢量参考。啥会失效?

有没有办法在一行中填充矢量地图

如何打印成对矢量数组的元素?

在展开期间将向量成员推入向量:vector.push_back(vector[0])