基于结构中矢量大小的数组初始化[c ++]

时间:2016-06-10 18:02:18

标签: c++ vector initialization

我尝试创建一个将区域拆分为子集的程序(此处为8),每个子集包含8个值(对应于预定义的向量)。 我定义了一个存储这些值(以及向量)的结构:

Reducer<Text,Text,Text,IntWritable>

但是,我在&#39;向量&#39;中收到了编译错误。 intialization:

struct Storage {
  static const int num_spatial_subset = 8;
  static const std::vector< std::vector<double> > vectors = 
    { {0,0,0}, 
      {0,1,0}, 
      {0,0,1}, 
      {1,1,0}, 
      {1,0,1}, 
      {0,1,1}, 
      {1,0,0}, 
      {1,1,1} };
  double storage[num_spatial_subset][vectors.size()];
};

所有Storage对象的向量都是相同的(这就是为什么我将它们定义为静态const)。

我知道我可以用vector替换我的存储变量并在Storage的构造函数中调整它,但是这将涉及将第一个向量的大小调整为8,并且循环以将所有内部向量的大小调整为8。 由于我可能需要创建数以千计的这些对象,因此我认为这不是最佳方法。

我真的不明白为什么编译器抱怨,因为向量是在编译时定义的(以及向量的数量)。

谢谢。

3 个答案:

答案 0 :(得分:1)

size上调用vector永远不会返回常量,因为它不符合常量的C ++规则。编译器不需要知道size()做了什么,并且就其所知,它返回自程序开始执行以来的时间。如果您知道该值是常量,那么您可以定义一个保存该值的常量。但编译器不需要具备为您执行此操作的知识。

即使编译器以某种方式知道该值是常量,也可以通过允许您编写类似的代码来帮助您。当下一版本的库或编译器或其他编译器不知道时会发生什么?

答案 1 :(得分:1)

  

错误:(需要进行类外初始化)

所以只做

<!DOCTYPE html>
<html>
<body>
<h1>Welcome !</h1>
<p><b>AN OBJECT</b> is also a variable.<b>Thus an object can also be used to store many values.</b></p>
<p id="demo">Click the button given below !</p>
<button type="button" onclick="me()">Click Here !</button>
<script>
function me()
{
	var car ={
	model:"BMW",class:"C",weight:"500",}
	document.getElementById("demo").innerHTML=car.model+"<br>"+car.class+"<br>"+car.weight;
	}
}
</script>
</html>

另外,您可以使用struct Storage { static const int num_spatial_subset = 8; static const std::vector< std::vector<double> > vectors; double storage[num_spatial_subset][3]; }; const std::vector< std::vector<double> > Storage::vectors = { {0,0,0}, {0,1,0}, {0,0,1}, {1,1,0}, {1,0,1}, {0,1,1}, {1,0,0}, {1,1,1} };

initializer_list

Demo

答案 2 :(得分:1)

由于看起来vectors不打算在运行时调整大小,我会抛弃vector s并使用静态2D数组。

编辑:

简单的解决方案是从类中删除vectors,以便在需要大小之前完全定义它。

const double vectors[][3] =
{
    { 0, 0, 0 },
    { 0, 1, 0 },
    { 0, 0, 1 },
    { 1, 1, 0 },
    { 1, 0, 1 },
    { 0, 1, 1 },
    { 1, 0, 0 },
    { 1, 1, 1 }
    // add more here and storage will resize
};

我们无法从数组中获取数组中的行数,因此我们需要做一些工作来获得Storage::storage的大小。我们不能获取行,但是我们可以在编译时获得整个数组的大小(sizeof(vectors)或8 * 3 * sizeof(double)= 192)在编译时和行中的行的大小数组(sizeof(vectors[0])或3 * sizeof(double)或24)。按行大小划分总大小将给出行数(192/24 = 8)。

struct Storage
{
    static const int num_spatial_subset = 8;
    // can't get the number of rows, but we can get the total size and divide 
    // it by the size of a row. 
    double storage[num_spatial_subset][sizeof(vectors) / sizeof(vectors[0])];
};

如果向量必须包含在Storage中,我们需要进行抽象,以便在需要之前定义vectors的大小:

struct BaseStorage
{
    static const double vectors[][3];
};
const double BaseStorage::vectors[][3] =
{
    { 0, 0, 0 },
    { 0, 1, 0 },
    { 0, 0, 1 },
    { 1, 1, 0 },
    { 1, 0, 1 },
    { 0, 1, 1 },
    { 1, 0, 0 },
    { 1, 1, 1 }
    // add more here and storage will resize
};

struct Storage: public BaseStorage
{
    static const int num_spatial_subset = 8;
    double storage[num_spatial_subset][sizeof(vectors) / sizeof(vectors[0])];
};