我尝试创建一个将区域拆分为子集的程序(此处为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。 由于我可能需要创建数以千计的这些对象,因此我认为这不是最佳方法。
我真的不明白为什么编译器抱怨,因为向量是在编译时定义的(以及向量的数量)。
谢谢。
答案 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
答案 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])];
};