我想初始化对象数组中的向量大小。
每个矢量都具有相同的大小......
LIB FILE:
#include <vector>
Class NameClass
{
public:
explicit NameClass( unsigned size )
{
vectorName.resize( size );
}
std::vector <type> vectorName;
};
主要文件:
#include "lib.hpp"
int main( void )
{
NameClass object( size ); #1
NameClass object[ number_objects ]( size ); #2
NameClass object[ number_objects ] = {NameClass(size), NameClass(size), ... }; #3
return 0;
}
#1有效,但不是数组, #2没有,编译器说“从int转换为非标量类型'NameClass'请求” 并且#3有效,但是......只是荒谬地初始化每个对象。而且我不能只在类中放置一个静态大小,因为值会改变。
所以...我的研究表明我需要使用std :: generate。问题是......什么是最好的方式?
很抱歉,如果使用std :: generate是一个简单的问题,我是初学者,并找到最佳解决方案。
有些人建议使用复杂的解决方案但是,我一直在使用我的解决方案
#include "lib.hpp"
int main( void )
{
unsigned number_objects = something;
unsigned size = other_thing;
NameClass object[ number_objects ];
for( unsigned i = 0; i < number_objects; i++)
object[i].vectorName.resize( size );
return 0;
}
我使用的是因为易于理解,有效。但我对其他易于理解的和功能性解决方案持开放态度。
答案 0 :(得分:1)
如果您愿意使用std::array
和C ++ 14,我们会得到:
template<std::size_t...Is>
auto index_over( std::index_sequence<Is...> ) {
return [](auto&&f)->decltype(auto) {
return decltype(f)(f)(std::integral_constant<std::size_t, Is>{}...);
};
}
template<std::size_t N>
auto index_upto( std::integral_constant<std::size_t, N> ={} ) {
return index_over( std::make_index_sequence<N>{} );
}
template<std::size_t N, class F,
class T = std::decay_t<std::result_of_t< F&( std::integral_constant<std::size_t, 0>& )>>,
class R = std::array<T, N>
>
R make_array( F&& f ) {
return index_upto<N>()( [&](auto...Is)->R {
return {{ f( Is )... }};
} );
}
我们传递make_array<count>
一个lambda。该lambda从一个编译时std::size_t
获取一个可转换的参数 - 其值为I,并返回该数组的第I个元素。
结果是std::array
大小为count
。
lambda可以使用auto I
来获取编译时的多汁性,或者仅使用std::size_t I
来获取值的运行时版本。
上面的大部分都可以翻译成C ++ 11,它只是变得丑陋。而且我不喜欢丑陋的代码。
您的代码如下:
int main( void )
{
unsigned size = 17;
constexpr std::size_t number_objects = 3;
auto objects = make_array<number_objects>( [&](std::size_t){ return NameClass(size); } );
}
和objects
现在是std::
个NameClass
长度为number_objects
的数组,大小为size
。
答案 1 :(得分:1)
为您的班级创建默认构造函数:
#include <vector>
class NameClass {
public:
NameClass() {} // default constructor
explicit NameClass( unsigned size ){
vectorName.resize( size );
}
std::vector <type> vectorName;
};
主要:
#include "lib.hpp"
int main( void )
{
unsigned number_objects = something;
unsigned size = other_thing;
NameClass object[ number_objects ];
for( unsigned i = 0; i < number_objects; i++)
object[i].vectorName.resize( size );
return 0;
}
示例2之所以不起作用,是因为C ++没有创建未为其提供默认构造函数的对象数组的语法。
在python中它看起来像:
[NameClass(size) for _ in range(number_objects)]
我离题了。
如果没有默认构造函数并且仍然创建一个列表,你可以使用它(问题是你想要这样做的原因):
#include <iostream>
static constexpr unsigned NUM_OBJECTS = 10;
static constexpr unsigned VEC_SIZE = 30;
int main() {
NameClass *objects = static_cast<NameClass *>(operator new [](NUM_OBJECTS * sizeof *objects));
for (unsigned i = 0; i < NUM_OBJECTS; i++) {
objects[i].vectorName.resize(VEC_SIZE);
}
// Required to free memory
operator delete[](objects);
return 0;
}
答案 2 :(得分:1)
如果使用向量不是问题,实际上这是有效的,并且非常简单。 这是一首诗......
<强>类TEST.CPP 强>
#include <stdio.h>
#include <algorithm>
#include "class.hpp"
int main( void )
{
std::vector <NameClass> object(number_objects, NameClass(size));
printf("%lu\n", object[0].vectorName.size() );
return 0;
}
<强> class.hpp 强>
#include <vector>
#include <algorithm>
#include <vector>
class NameClass {
public:
NameClass() {} // default constructor
explicit NameClass( unsigned size ){
vectorName.resize( size );
}
std::vector <double> vectorName;
};
如果你想使用数组,那么只需使用默认的构造函数。
<强> clas.hpp 强>
#include <vector>
class NameClass {
public:
NameClass(unsigned size) {
vectorName.resize( size );
} // default constructor
explicit NameClass( unsigned size ){ // eliminate this
vectorName.resize( size );
}
std::vector <type> vectorName;
};
<强>类TEST.CPP 强>
#include <stdio.h>
#include "class.hpp"
int main() {
NameClass objects[2](4);
printf("%lu\n", objects[0].vectorName.size());
return 0;
}
这打印出正确的输出。
答案 3 :(得分:0)
你必须初始化每个向量,它只是你在代码中呈现它的方式。你可以做点什么
std::vector<NameClass> classes(number_of_objects);
std::generate(classes.begin(), classes.end(), []{return NameClass(size);});
std :: generate将为向量的每个元素初始化NameClass的实例。