You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 04:24:01