【问题标题】:push_back issue std::vectorpush_back 问题 std::vector
【发布时间】:2023-03-21 10:00:01
【问题描述】:

OSX 10.7,XCode 4。

我有一个小问题:在选择过程之后,我需要将 2D vector<vector<float>> 推回 3D 矢量。它在 stl::vector 模板的 push_back 函数中引发 EXC_BAD_ACCESS 错误。看起来它应该很简单(我以前曾多次使用过复杂的数据结构),我尝试了各种不同的想法,但都无济于事。其他一切都有效,并将我期望的值输出到命令行。我敢肯定它的代码是盲目的,而且有一些容易上手的代表。

我问只是因为我相信我的语法是正确的,但在编译时我遇到了问题。下面是一些示例代码:

实施:

for(int i=0;i<fdisVec.size();i++){

    int j;

        if(fdisVec[i] < fdisVec2[i]){

            j = 0;

        }

        else if(fdisVec2[i] < fdisVec[i]){

            j = 1;

        }

    clusters[j].push_back(allMfccs[i]);

}

我的 .h 有这样声明的对象(类的公共成员):

    vector< vector <float> > allMfccs;
    vector< vector < vector <float> > > clusters; 

如果它有帮助,fdisVec 和 fdisVec2 也是 2d 向量,但是,“if else”语句会响应我想要的方式 - 我非常怀疑它是否与此有关。

【问题讨论】:

  • 如果您正在处理 vecs of vecs of floats,您可能需要考虑使用像 boost::numeric::ublas::matrix 这样的矩阵类型。它有一个类似 STL 的界面。尝试使用 .at() 而不是 [] 看看是否抛出异常。
  • 尺寸是多少?是不是内存不够了?
  • 如果值相等,j 未初始化。
  • 注意:如果fdisVec2[i]fdisVec[i] 相等,j 将被初始化。

标签: c++ vector push-back


【解决方案1】:

如果 fdisVec[i] == fdisVec2[i] 怎么办?

在这种情况下,j 未初始化(垃圾),有时该值不是您的集群向量的有效索引。

【讨论】:

  • 刚刚尝试将 if 更改为 if(fdis
  • clusters.size() 的值是多少? allMfccs.size()? fdisVec.size()?
  • allMfccs.size() = 2998, fdisVec.size() = 2998, clusters.size() = 0。我还没有使用集群,这个循环处理填充该 3D 的过程矢量正确。
  • clusters.size()==0 是问题所在。您需要向其中添加两个空向量,以便放置您的值。
  • al a cluster[0].push_back(vector>>)?
【解决方案2】:

尽管cluster.size() == 0 将是一个问题(正如@VaughnCato 的回答中所讨论的那样),访问集群的元素不会导致编译时错误,但很可能会在您运行程序时崩溃.

但是,编译时错误是由于 clusters[j] 期望 vector&lt; vector&lt; float &gt; &gt;allMfccs[i] 只是 vector&lt; float &gt;

因此,根据您对clustersallMfccs 的声明,您需要推送allMfccs

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-15
    • 2021-06-18
    • 1970-01-01
    • 2015-01-15
    • 2016-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多