矢量迭代器不可解引用(矢量内部的矢量)
Vector iterator not dereferencable (vector inside vector)
我正试图将这些向量中的一些数据写入文本文件。当我运行代码时,它会返回一个运行时错误。Category
、Product
、Cart
、Customer
和Address
都是具有每个get_member
返回的成员的struct
。
ofstream write_cats;
write_cats.open("catprd.dat", ios::out, ios::trunc);
vector<Category>::iterator i;
write_cats << cats.size() << endl;
for (i = cats.begin(); i < cats.end(); i++) {
write_cats << i -> get_catid() << 't';
}
vector<Product>::iterator j;
write_cats << prods.size() << endl;
for (j = prods.begin(); j < prods.end(); j++) {
write_cats << j -> get_prodid() << 't';
write_cats << j -> get_prodprice() << endl;
}
write_cats.close();
ofstream write_carts;
write_carts.open("carts.dat", ios::out, ios::trunc);
vector<Cart>::iterator k;
write_carts << carts.size() << endl;
for (k = carts.begin(); k < carts.end(); k++) {
write_carts << k -> get_cartid() << 't';
write_carts << k -> get_day() << endl;
}
vector<Cart_item>::iterator l;
write_carts << cart_items.size() << endl;
for (l = cart_items.begin(); l < cart_items.end(); l++) {
write_carts << l -> get_cartitemid() << 't';
write_carts << l -> get_qty() << endl;
}
write_carts.close();
ofstream write_custs;
write_custs.open("custs.dat", ios::out, ios::trunc);
vector<Customer>::iterator m;
vector<Address>::iterator n;
write_custs << custs.size() << endl;
for (m = custs.begin(); m < custs.end(); m++) {
write_custs << m -> get_cust_id() << 't';
write_custs << n -> get_zip_code() << endl;
}
write_custs.close();
返回运行时错误"矢量迭代器不可取消引用"
以下是struct Address
的样子:
using namespace std;
#pragma once
#include <string>
struct Address {
public:
int get_st_number() const{return st_number;}
int get_zip_code() const{return zip_code;}
string get_st_name() const{return st_name;}
Address(){}
Address (int num, string name, int zip)
: st_number(num), st_name(name), zip_code(zip) {}
private:
int st_number;
int zip_code;
string st_name;
};
和struct Customer
:
struct Customer {
public:
Address get_address() const{return addr;}
int get_cust_id() const{return cust_id;} customer id
string get_name() const{return cust_name;}
Customer (int id, string n, Address a)
: cust_id(id), cust_name(n), addr(a) {}
string display_addr() const {
std::cout<<setw(15)<<cust_name<<" ";
std::cout<<setw(15)<<cust_id<<" ";
return string();
}
private:
int cust_id;
string cust_name;
Address addr;
};
您忘记初始化vector<Address>::iterator n;
您声明了一个迭代器n
,但没有将其初始化为可取消引用的值。从您的更新来看,您似乎想要打印与客户关联的Address
;因此,您可以通过m
引用的客户进行访问,而不是通过单独的迭代器:
write_custs << m -> get_cust_id() << 't';
write_custs << m -> get_address().get_zip_code() << endl;
此外,在每个迭代器的循环中确定其范围可能是个好主意;这比每次在外部范围内声明一个新的更不容易出错
for (vector<Whatever>::const_iterator i = stuff.begin(); i != stuff.end(); ++i) {
// do stuff with "i"
}
// "i" is no longer available - no danger of accidentally using it again.
还有其他几点:
- 您应该使用
!=
而不是<
来与end()
迭代器进行比较;<
不适用于某些类型的迭代器 - 您应该以
'n'
而不是endl
的形式向文件写入新行;endl
刷新文件缓冲区,迫使文件在此时写入磁盘,这可能非常缓慢
相关文章:
- 如何获得对不同类的引用,以便从所述类内部获得变量值
- C++/Arduino 如何从类内部引用全局
- 结构内部的结构:"对非静态成员的非法引用"错误
- 如果不允许我分配 rvalues 来引用为什么以下代码片段有效,这在内部如何工作?
- IFDEF块内部对功能的未定义引用
- 当在函数内部使用静态变量时,输出会发生变化,该函数在c++中返回引用
- 通过<T> Boost.Python 作为内部引用公开 boost::可选或 None
- 在函数内部创建一个局部向量,然后将其作为引用传递给其他函数,这些函数将其存储为引用
- 另一个结构内部的结构数组的成员变量没有通过引用传递
- 在 C++ 中作为指针或别名进行内部编译的引用
- 如何通过参数内部的引用传递对象
- c++在函数内部创建引用变量
- 如何将相互依赖的对象移动到一起并维护内部引用
- 引用对象内部的指针
- c++引用函数内部的函数
- 包含内部引用的初始值设定项列表
- 如何修改/更新通过 const 引用传递的对象的内部状态
- 修改对内部数据的引用时更新 STL 优先级队列
- 矢量迭代器不可解引用(矢量内部的矢量)
- lambda内部引用捕获对象的类型