删除向量的向量中的错误

delete error in vector of vector

本文关键字:向量 错误 删除      更新时间:2023-10-16

我很困惑使用vector of vector of int:在我删除一个整数后,它仍然存在!

#include "stdafx.h" 
#include <vector>
#include <algorithm>
#include <iostream>

int main(){
    //everything works fine with a vector of integer:
    std::vector<int> vi;
    vi.push_back(42);
    std::vector<int>::iterator intIter = std::find(vi.begin(), vi.end(), 42);
    if (intIter != vi.end())
        vi.erase(intIter);
    std::cout << "VI  content: ";
    for (auto l : vi)
        std::cout << l << " ";
    std::cout << "." << std::endl;
    //but not with a vector of vector of integer:
    std::vector< std::vector<int>> vvi; 
    std::vector<int> viTemp;
    viTemp.push_back(42);
    vvi.push_back(viTemp);
    for (auto viIter : vvi) {
        std::vector<int>::iterator intIter = std::find(viIter.begin(), viIter.end(), 42);
        if (intIter != viIter.end())
            viIter.erase(intIter);
    }
    std::cout << "VVI content: ";
    for (auto viIter2 : vvi) {
        for (auto intIter2 : viIter2)
            std::cout << intIter2 << " ";
        std::cout << ";";
    }
    std::cout << "." << std::endl;
}

运行后,结果显示:

VI  content: .
VVI content: 42 ;.

表示整数向量vi删除了内容;然而,整数向量vvi的向量仍然有42 !

我错在哪里?

当你在循环中声明auto变量时,它会创建一个vector<int>变量,所以基本上你是在删除向量

副本上的值
 for (auto viIter : vvi) {

应该这样做:

for (auto &viIter : vvi) {

现在auto变量是一个引用,你是在删除vector本身的值,而不是在副本上。

与Java, Python或c#不同,在c++中,当您在vector中存储vector时,您按值存储它,即复制它。

如果要修改vector内部的vector,则需要使用&参考:

std::vector<std::vector<int>> vectorOfVectors;
vector<int> &referenceToVector = vectorOfvectors.at(index);
referenceTovector.push_back(value);

现在,向量内部的向量被改变了。

但是要小心&参考。不要存储它,确保不要在它引用的向量不再存在之后使用它,&c。,因为它实际上是一个伪装的原始指针:)

P.S. .at(index)是表示[index]的安全方式,因为.at()是范围检查的,而[]不是。