如何在向量<vector <float> *&gt; *?</vector <float>中写入数据

时间:2014-07-14 09:49:46

标签: c++ vector

我正在尝试为矢量矢量分配空间但在分配gdb后显示pVectorTemp_中的空格但显示大小为2

#include <iostream> 
#include<vector>
using namespace std; 
int main( )
{ 
    int index1 = 2;
    int index2 = 2;
    vector<vector<float>*>* pVectorTemp_ =  NULL;
    pVectorTemp_  = new vector<vector<float>*>();
    pVectorTemp_->resize(index1);
    for(unsigned int i=0 ;i< index1;i++)
    {
        vector<float>* pvecTemp = new vector<float>();
        pvecTemp->resize(index2);
        (*pVectorTemp_)[index1] = (pvecTemp);
    }
    return 0;
}

gdb:

(gdb) pvector  pVectorTemp_
elem[0]: $2 = (std::vector<float, std::allocator<float> > *) 0x0
elem[1]: $3 = (std::vector<float, std::allocator<float> > *) 0x0
Vector size = 2
Vector capacity = 2

所以我做错了吗?

4 个答案:

答案 0 :(得分:3)

for循环体内,你有:

(*pVectorTemp_)[index1] = (pvecTemp);

但请注意,for循环的索引为 i index1是上限)。

所以,我认为你有一个拼写错误或错误,你可能想在i内使用index1(不是[...])作为索引。

另请注意,您有signed / unsigned不匹配,因为在循环中您将unsigned int作为索引,并将其与index1进行比较,这是一个有符号整数。


但是,无论如何,你的代码是无用的复杂。

您不需要使用new在堆上分配所有这些向量 只需使用自动&#34; stack&#34; )分配,例如:

int main()
{ 
    int index1 = 2;
    int index2 = 2;

    // Your original code is commented out:
    //
    // vector<vector<float>*>* pVectorTemp_ =  NULL;
    // pVectorTemp_  = new vector<vector<float>*>();
    vector<vector<float>> vectorTemp;

    // pVectorTemp_->resize(index1);
    // Just consider calling push_back.

    for (int i = 0; i < index1; i++)
    {
        // vector<float>* pvecTemp = new vector<float>();        
        // pvecTemp->resize(index2);
        // (*pVectorTemp_)[index1] = (pvecTemp);
        vectorTemp.push_back(vector<float>(index2));
    }

    // No need for return 0 in main().
    // return 0;
}

了解代码如何简化!

(没有评论的代码如下。)

int main()
{ 
    int index1 = 2;
    int index2 = 2;

    vector<vector<float>> vectorTemp;        
    for (int i = 0; i < index1; i++)
    {
        vectorTemp.push_back(vector<float>(index2));
    }
}

作为进一步的改进,假设您的C ++ STL实现提供了这一点,您可能希望使用 emplace_back() 而不是push_back()来构建嵌套向量:

// Instead of vectorTemp.push_back(vector<float>(index2));
//
vectorTemp.emplace_back(index2);

在这种情况下,vector大小index2会直接构建到vectorTemp(&#34;外部&#34;向量)容器中,而不会产生临时值。

您可能还需要阅读StackOverflow上的this thread以获取更多详细信息:

  

push_back vs. emplace_back

答案 1 :(得分:1)

这些是我能找到的东西。

vector<vector<float>*>* pVectorTemp1 =  new vector<vector<float>*>(); // (1)(4)
pVectorTemp1->resize(index1);
for (int i=0 ; i < index1; i++) { // (2)
    vector<float>* pvecTemp2 = new vector<float>(); /(4)
    pvecTemp2->resize(index2);
    (*pVectorTemp1)[i] = (pvecTemp2); // (3)
}
  1. 只有尾随下划线不同的变量才会出现问题。
  2. unsigned除了签名/未签名错误的风险外,什么都不添加
  3. 索引应为i而不是index1
  4. 最好使用局部变量而不是堆分配和指针,但这会过多地改变代码。

答案 2 :(得分:1)

更改

(*pVectorTemp_)[index1] = (pvecTemp);

(*pVectorTemp_)[i] = (pvecTemp);

答案 3 :(得分:1)

  

所以我做错了吗?

是的,你做错了什么:

  • 在不需要时使用动态分配
  • 使用不必要的原始循环

这是一个简化版本:

int main( )
{ 
    int index1 = 2;
    int index2 = 2;
    std::vector<std::vector<float>> pVectorTemp_
        ( index1
        , std::vector<float>(index2) );
}

Live demo