删除向量的向量中的错误
delete error in vector of vector
我很困惑使用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()是范围检查的,而[]不是。
相关文章:
- C++中函数的向量返回类型引发错误
- 尝试将unique_ptrs推送到向量时使用纯虚拟函数错误
- 在c++中键入向量中的所有值后,得到分段错误(核心转储)
- 如何使用C++初始化向量;脚本化值不是数组、指针或矢量错误
- 对象指针 c++ 的全局向量错误
- C++:自定义数据类型向量错误的队列
- getCompatibleComponent返回向量错误
- FlatBuffers:未支撑的工会向量错误将JSON文件转换为二进制文件
- 尝试调用 at() 时 c++ 中的向量错误
- 结果向量错误
- 尝试用函数填充线程向量 - 错误
- C++ 布尔向量错误:赋值时"iterator not dereferencable"
- CUDA 推力:类的:d向量 |错误
- C++多结构向量错误
- c++正则化向量;错误:无法绑定
- c++向量错误
- 向量错误抛掷分配经验甚至不访问任何元素
- std::函数的向量错误
- STL向量错误:未知类型名称
- 向量错误分配错误 C++