【问题标题】:Want to declare an array of vectors想要声明一个向量数组
【发布时间】:2014-12-17 00:29:25
【问题描述】:

由于一些遗留代码,我需要声明一个向量数组。我试过了:

vector< foo> a[numvecs];  

然后分配向量:

a[i]=vector<foo>(foosize);  

但我似乎无法正确访问或写入内部向量

afile.read((char *)&a[i][0],foosize*sizeof(foo))

导致段错误

我会声明一个向量的向量,但外部向量是固定大小的并且非常小(通常为 1 到 3),而且还由于传统代码的编写方式。另外,当我这样做并尝试在向量中打印任何内容时,我会收到有关类型不匹配的编译器错误,有什么线索吗?

【问题讨论】:

  • vector&lt;vector&lt; foo&gt;&gt; a; a.resize(numvecs,vector&lt;foo&gt;(foosize));呢?
  • vector&lt;foo&gt; a[numvecs]; 不是有效的 C++,除非 numvecs 是编译时已知的常量;如果代码编译它是因为编译器扩展。无论如何,假设 foo 是一个可轻松复制的类型,那么您显示的代码应该可以工作。
  • 请发MCVE
  • 注意vector&lt;foo&gt; a[numvecs]; 分配了所有的向量; a[i] = vector&lt;foo&gt;(foosize); 行通过复制大小为foosize 的临时向量的大小和内容来更新a[i]。 (与使用 resize 相比,这有效,但不那么惯用)。
  • numvecs 是实际数字的伪代码,就像 foo 不是编译器在编译时知道的实际类型一样

标签: c++ arrays vector


【解决方案1】:

假设numvecs 是编译时常量(或编译器扩展),您至少可以更改这一行:

a[i]=vector<foo>(foosize);  

到这个简化的行:

a[i].resize(foosize);  

如果已正确分配,您显示访问vector 的内容应该可以正常工作。不过,我建议使用括号来帮助编译器知道你想要它做什么:

afile.read(reinterpret_cast<char*>(&(a[i])[0]), foosize*sizeof(foo));

或者甚至使用参考来使其更易于阅读:

vector<foo> &vec = a[i];
afile.read(reinterpret_cast<char*>(&vec[0]), foosize*sizeof(foo));

【讨论】:

    【解决方案2】:
    vector <vector <foo> > a;
    
    a.resize(<size>);
    for(int =0; i < a.size(); i++) {
        a[i].resize(<size>);
    }
    

    我认为这应该可行

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 2022-08-12
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多