将动态数组数组设置为数组或容器c ++

时间:2014-03-03 11:17:26

标签: c++ arrays vector

我正在寻找,以尽量减少每次我想要声明数组的需要 定义硬编码数组,例如,如果我需要设置数字

的向量元素数组

我需要: 其中:

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;
}

可以缩短吗?

3 个答案:

答案 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::beginstd::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}, {....} };