vector类型为结构体,根据结构体成员来删除对应的结点
2013-09-27 17:12
369 查看
通过iterator来遍历vector成员用erase删除结点会出现错误,
如下程序:
程序是想删除结构体成员中index等于3的那个结点,但是程序输出会出现错误。原因是当vec_cutdata.erase(it);之后it失效了,接下来的循环就会出现异常。所以该方法行不通了。
下面提供两种方法根据结构体成员值来删除对应结点:
方法一:
方法二:
如下程序:
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct cuttime{ int index; long begin; long end; }; vector<cuttime> vec_cutdata; vector<cuttime>::iterator cutdata_iter; int main() { cuttime cut1,cut2,cut3,cut4; cut1.index=1; cut1.begin=5; cut1.end=10; cut2.index=2; cut2.begin=6; cut2.end=12; cut3.index=3; cut3.begin=7; cut3.end=14; cut4.index=4; cut4.begin=8; cut4.end=15; vec_cutdata.push_back(cut1); vec_cutdata.push_back(cut2); vec_cutdata.push_back(cut3); vec_cutdata.push_back(cut4); vector<cuttime>::iterator it; for(it=vec_cutdata.begin();it!=vec_cutdata.end();) { if (it->index==3) { vec_cutdata.erase(it); } } for(cutdata_iter=vec_cutdata.begin();cutdata_iter!=vec_cutdata.end();++cutdata_iter) { cout<<cutdata_iter->index<<" "<<cutdata_iter->begin<<" "<<cutdata_iter->end<<" "<<endl; } return 1; }
程序是想删除结构体成员中index等于3的那个结点,但是程序输出会出现错误。原因是当vec_cutdata.erase(it);之后it失效了,接下来的循环就会出现异常。所以该方法行不通了。
下面提供两种方法根据结构体成员值来删除对应结点:
方法一:
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct cuttime{ int index; long begin; long end; }; vector<cuttime> vec_cutdata; vector<cuttime>::iterator cutdata_iter; int main() { cuttime cut1,cut2,cut3,cut4; cut1.index=1; cut1.begin=5; cut1.end=10; cut2.index=2; cut2.begin=6; cut2.end=12; cut3.index=3; cut3.begin=7; cut3.end=14; cut4.index=4; cut4.begin=8; cut4.end=15; vec_cutdata.push_back(cut1); vec_cutdata.push_back(cut2); vec_cutdata.push_back(cut3); vec_cutdata.push_back(cut4); vector<cuttime>::iterator it; for(it=vec_cutdata.begin();it!=vec_cutdata.end();) { if (it->index==3) { it=vec_cutdata.erase(it); } else ++it; } for(cutdata_iter=vec_cutdata.begin();cutdata_iter!=vec_cutdata.end();++cutdata_iter) { cout<<cutdata_iter->index<<" "<<cutdata_iter->begin<<" "<<cutdata_iter->end<<" "<<endl; } return 1; }
方法二:
#include<iostream> #include<vector> #include<algorithm> using namespace std; struct cuttime{ int index; long begin; long end; }; vector<cuttime> vec_cutdata; vector<cuttime>::iterator cutdata_iter; int main() { cuttime cut1,cut2,cut3,cut4; cut1.index=1; cut1.begin=5; cut1.end=10; cut2.index=2; cut2.begin=6; cut2.end=12; cut3.index=3; cut3.begin=7; cut3.end=14; cut4.index=4; cut4.begin=8; cut4.end=15; vec_cutdata.push_back(cut1); vec_cutdata.push_back(cut2); vec_cutdata.push_back(cut3); vec_cutdata.push_back(cut4); for(size_t i=0;i<vec_cutdata.size();) { if(vec_cutdata[i].index==3) { vec_cutdata.erase(vec_cutdata.begin()+i); } else ++i; } for(cutdata_iter=vec_cutdata.begin();cutdata_iter!=vec_cutdata.end();++cutdata_iter) { cout<<cutdata_iter->index<<" "<<cutdata_iter->begin<<" "<<cutdata_iter->end<<" "<<endl; } return 1; }
相关文章推荐
- 关于stl::vector中存储带指针类型成员的结构体指针
- 遍历所有驱动的名_根据本驱动对象的成员(DriverObject->DriverSection)_对应LDR_DATA_TABLE_ENTRY结构体_双向链表使用
- 根据成员变量的地址推算出结构体变量的地址
- 结构体中有map类型成员,不能初始化
- 结构体内存对齐规则总结-整体单个排列/成员之间没有边界只有最后的填充/最后是最大类型整数倍
- 根据多个索引高效删除python list中对应位置的元素
- xorm根据数据库表生成对应的结构体
- list结构体根据某个成员进行排序
- EF调用存储过程查询表中的部分字段,报数据读取器与指定的“AdventureWorksDWModel.Student”不兼容。某个类型为“Age”的成员在同名的数据读取器中没有对应的列。
- vector容器结构体类型查找
- 结构体中申明枚举类型成员后,为什么结构体的长度为0
- 对map, vector类型的静态成员初始化
- POI-根据Cell获取对应的String类型值
- vector结构体 删除
- 根据结构体的一个成员来获取其他成员的使用
- 【C_C++】根据结构体中的成员地址求结构体的地址
- java根据文件后缀名获得对应的MIME类型
- 自己实现vector,对于自定义类型可用,可以实现vector的嵌套。功能上目前只实现了插入和删除。
- vector类型的常对象与iterator常对象的对应使用
- 数据读取器与指定的“WNWModel.WNW_Pipe”不兼容。类型“Label”的成员在同名的数据读取器中没有对应的列