首页 > 解决方案 > 如何像擦除二维向量中的元素一样擦除一行

问题描述

我是 C++ 向量的新手,想问一个关于它的问题。我在下面构建了一个二维向量:

1 2 3
4 5 6
7 8 9

并用这些代码擦除 4...

#include <vector>
#include <iostream>

using namespace std;

int main() {

    vector<vector<int>> v;

    for (int i = 0; i < 3; i++) {

        vector<int> r;

        for (int j = 0; j < 3; j++) {
            int input;
            cin >> input;
            r.push_back(input);
        }
        v.push_back(r);
    }
    v.at(1).erase(v.at(1).begin() + 0);//erase the 4
}

正如我们所知,5 取代了 4 并成为第二行中的第一个元素,就像这样......

1 2 3
5 6
7 8 9

但是当我试图通过...擦除或清除整个第二行时

v[1].clear();//or do v.at(1).erase(v.at(1).begin()+0) twice

矩阵变成了……

1 2 3

7 8 9

第二行的元素消失了,但第三行没有占据它的位置。我应该如何擦除(或清除)整行并制作下一行来替换它的位置?

标签: c++vector

解决方案


clear方法仅从向量中删除所有元素,而不是向量本身。你可以用

v[1].clear();
v.erase(v.begin() + 1);

我将更详细地解释它:v.begin()返回一个指向外部向量的第一个元素的迭代器。v.begin() + 1将这个迭代器前进一个指向向量 at v[1]v.erase(...)获取此迭代器并删除与其关联的向量。

如果在堆上分配指针,请记住正确处理指针,否则会泄漏已用内存。


推荐阅读