将作为参数传入的对象的数组转换为vector

时间:2019-10-09 14:26:28

标签: c++ vector iterator

我正在尝试将Wall数组转换为Wall的向量。该数组作为参数传入,并且在函数中我尝试使用insert()对其进行转换。我收到一条错误消息,指出“没有重载函数“ std :: begin的实例”与参数列表匹配-参数类型为:(Wall *)“

int func(int row, int col, Wall walls[]) {
  // Some code before ...

  // Converting array of Wall to vector
  std::vector<Wall> vecWalls;
  vecWalls.insert(vecWalls.begin(), std::begin(walls), std::end(walls));
 }

我试图在函数内创建另一个Wall数组,并将其用作insert()的参数。但是,这没有造成任何问题。

Wall walls2[5];
std::vector<Wall> vecWalls;
vecWalls.insert(vecWalls.begin(), std::begin(walls2), std::end(walls2));

我的Wall数组作为参数传递时发生了什么。

3 个答案:

答案 0 :(得分:1)

参数Wall walls[]将衰减为Wall *walls。由于丢失了长度信息,因此您将需要传递该数组中的元素数作为参数。像这样:

int func(int row, int col, Wall* walls, int len) {
    std::vector<Wall> vecWalls;
    vecWalls.insert(vecWalls.begin(), walls, walls + len);

    //or shorter:
    std::vector<Wall> vecWalls2(walls, walls + len);
}

答案 1 :(得分:0)

简单的C数组对迭代器一无所知,但是您可以在最后一个数组项的后一个和后一个数组中使用简单的指针填充std :: vector。

int func(Wall* walls, size_t arraySize)
{
    std::vector<Wall> vecWalls;
    vecWalls.insert(vecWalls.begin(), &walls[0], &walls[arraySize]);

    return 0;
}

int main()
{
    Wall walls[10] = {};
    // Fill walls array

    const size_t arraySize = sizeof(walls) / sizeof(walls[0]);
    func(walls, arraySize);
}

此外,如果创建新矢量,则可以使用简单数组中的项将其初始化,如下所示:

std::vector<Wall> vecWalls2(&walls[0], &walls[arraySize]);

答案 2 :(得分:0)

标准函数std::beginstd::end不能与指针一起用作参数。

在函数声明中

int func(int row, int col, Wall walls[]) {

编译器将参数Wall walls[]调整为指针类型Wall *walls,并且传递给函数数组的内容也隐式转换为指向其第一个元素的指针。

我想在函数中,由墙指向的数组不会改变。

在这种情况下,可以通过以下方式定义功能

int func( int row, int col, const Wall walls[], size_t n ) {
  // Some code before ...

  // Converting array of Wall to vector
  std::vector<Wall> vecWalls( walls, walls + n );
 }