C++使用vector存储双向链表头指针编译错误及访问方法咨询
问题排查与解决方案
一、编译错误原因及修复
1. 核心错误:类型与变量名混淆
你代码中定义的vector < block* > set;里的set是全局变量名,不是自定义类型,你后续在insert、find函数参数中直接把set作为类型名使用,编译器无法识别该类型,就会抛出参数解析相关的所有报错。
另外注意C++标准库的std命名空间下自带std::set容器,如果你代码中加了using namespace std;,这个变量名还会和标准库命名冲突,建议优先修改全局变量名避免冲突。
2. 其他细节错误
temp=cashblock;中temp没有提前声明类型,需要补充声明,例如你操作的是链表节点指针,就写block* temp = cashblock;- 从你函数内
temp->prev的用法来看,insert、find的第一个参数本质是要传入链表节点指针block*,不是你误以为的set类型。
修复示例代码
typedef long long ll; struct block { ll tag; bool valid_bit; bool dirty_bit; block* next; block* prev; }; // 修改变量名,避免和std::set冲突,类型是vector,存每个链表的首节点指针 vector<block*> block_set; // 向链表插入新block的函数,第一个参数改为block*类型 void insert(block* cashblock, ll tag1=-1, bool d=0) { block* temp = cashblock; // 补充temp的类型声明 int i=0; // 检查set的关联度 while (temp->prev != NULL) { // 你原来的逻辑代码 } } // find函数第一个参数也改为block*类型 bool find(block* tmp, ll tag1) { while(tmp->prev != NULL) { // 你原来的逻辑代码 } }
二、vector存储的链表指针成员访问问题
你想访问vector第0个元素指向的链表节点的tag成员,set[0]->tag的写法逻辑是完全正确的:
set[0](如果是修改后的变量名就是block_set[0])取出的是vector中存储的block*类型指针- 指针访问结构体成员直接用
->运算符即可,符合语法规则
注意:使用前请确保vector的长度≥1,且
block_set[0]不是空指针,否则会触发运行时段错误。
内容的提问来源于stack exchange,提问作者Chandan Varma
相关产品推荐
相关产品推荐

