我正在寻找,以尽量减少每次我想要声明数组的需要 定义硬编码数组,例如,如果我需要设置数字
的向量元素数组我需要: 其中:
std::vector<std::vector<int> > LineVectorBasic;
int arr1[] = {0,2 ,1,2 ,2,2 ,3,2 ,3,2};
LineVectorBasic.insert(LineVectorBasic.begin() + 0,setLineVector(arr1));
int arr2[] = {0,2 ,1,2 ,2,2 ,3,2 ,3,2};
LineVectorBasic.insert(LineVectorBasic.begin() + 1,setLineVector(arr2)); // X 5 or what ever ....
....
....
std::vector<int> LinesManager::setLineVector(int values[])
{
std::vector<int> templine;
for(int i=0; i<sizeof(values);i++)
{
templine.insert(templine.begin() + i, values[i]);
}
return templine;
}
可以缩短吗?
答案 0 :(得分:2)
首先这个功能是错误的
std::vector<int> LinesManager::setLineVector(int values[])
{
std::vector<int> templine;
for(int i=0; i<sizeof(values);i++)
{
templine.insert(templine.begin() + i, values[i]);
}
return templine;
}
sizeof(values)
不等于作为函数参数传递的数组中的元素数。根据使用的平台,它等于sizeof( int * )
,或者是4或8个字节,你应该明确地将这个数量的元素传递给函数。
您可以简单地编写表达式
而不是函数std::vector<int>( std::begin( arr ), std::end( arr ) );
这就够了。
此外,您甚至不需要使用该阵列。你可以写
std::vector<int>( {0,2 ,1,2 ,2,2 ,3,2 ,3,2} );
如果用于初始化向量的数组具有相同的大小,则最好使用标准类std::array
,因为您可以为其分配新的初始化列表。例如
std::array<int, 10> arr = {0,2 ,1,2 ,2,2 ,3,2 ,3,2};
std::vector<int>( std::begin( arr ), std::end( arr ) );
arr = { 5,2 ,3, 4 ,2, 2, 1, 2 ,6,2};
std::vector<int>( std::begin( arr ), std::end( arr ) );
答案 1 :(得分:0)
对于每个阵列,请执行以下操作:
LineVectorBasic.emplace_back( std::begin(arr1), std::end(arr1) );
使用带有两个迭代器的costructor,就地构造向量。 std::begin
和std::end
是将迭代器返回到c风格数组的实用函数。
答案 2 :(得分:0)
如果您使用的是兼容C ++ 11的编译器,则可以执行以下操作:
std::vector<std::vector<int> > LineVectorBasic { {0,2 ,1,2 ,2,2 ,3,2 ,3,2}, {0,2 ,1,2 ,2,2 ,3,2 ,3,2}, {....} };