我很惊讶地发现,
是否有一种方法可以使
例如,考虑以下内容:
这将导致输出结果为:
boost::multi_array
似乎与 std::vector
不同,它似乎不会使用默认值或默认构造函数填充每个元素。我很难找到更多关于这方面的信息。是否有一种方法可以使
multi_array
在每个元素中填充一个唯一的对象?例如,考虑以下内容:
static int num = 0;
struct A {
int n;
A() : n((::num)++) {
std::cout << "A()" << std::endl;
}
virtual ~A() {}
void print() {
std::cout << "n=" << n << std::endl;
}
};
int main() {
std::cout << "vector:" << std::endl;
std::vector<A> v(3);
for (auto x : v) {
x.print();
}
std::cout << "multi:" << std::endl;
boost::multi_array<A, 2> m(boost::extents[2][2]);
for (auto x : m) {
for (auto y : x) {
y.print();
}
}
}
这将导致输出结果为:
vector:
A()
A()
A()
n=0
n=1
n=2
multi:
A()
n=3
n=3
n=3
n=3
为什么multi_array
的构造函数只被调用一次?如何使用A
的默认构造函数填充multi_array
以获取唯一对象?
std::vector
的行为取决于您使用的 C++ 版本!这是在 C++98 和 C++11 标准之间发生的变化之一。(在 C++98 中,第一个元素被构造,其余的则被复制,在 C++11 中则全部被构造)。multi_array
的行为与旧的 C++98std::vector
保持一致,并且过去一直如此。也许需要一个更新的(一致的)版本的multi_array
。 - alfC