指向结构的指针向量

Posted

技术标签:

【中文标题】指向结构的指针向量【英文标题】:Vector of Pointers to Structure 【发布时间】:2021-11-15 13:28:46 【问题描述】:

请帮助我在下面出错的地方。我想通过向量维护多个链表。 向量中的条目应该存储双向链表的第一个节点的指针。 下面是我的代码。我有两个功能首先是在给定的链表中插入一个节点。这个链表的头部将存储在向量中。

typedef long long  ll;
struct block

  ll tag;
  bool valid_bit;
  bool dirty_bit;
  block* next;
  block* prev;
;

vector < block* > set;

// Function to Insert new block in the set
void insert(set cashblock, ll tag1=-1,bool d=0) 

   temp=cashblock;
   int i=0;
   //check the associativity for the set
   while (temp->prev!=NULL)
   
......more code here....



bool find(set tmp,ll tag1)

    while(tmp->prev!=NULL)
    
...more code here...

错误如下-

43 | void insert(set cashblock,ll tag1=-1,bool d=0)
      |             ^~~
main.cpp:43:16: error: expected ‘)’ before ‘cashblock’
   43 | void insert(set cashblock,ll tag1=-1,bool d=0)
      |            ~   ^~~~~~~~~~
      |                )
main.cpp:43:30: error: expected primary-expression before ‘tag1’
   43 | void insert(set cashblock,ll tag1=-1,bool d=0)
      |                              ^~~~
main.cpp:43:38: error: expected primary-expression before ‘bool’
   43 | void insert(set cashblock,ll tag1=-1,bool d=0)
      |                                      ^~~~
main.cpp:92:16: error: ‘tmp’ was not declared in this scope; did you mean ‘tp’?
   92 | bool find(set* tmp,ll tag1)
      |                ^~~
      |                tp

还有一个问题:另外,如果我需要访问向量中的第 0 个元素,它是指向链表的指针,请告诉我。它应该像 set[0]->tag 还是正确的调用方式。

【问题讨论】:

vector &lt; block* &gt; set;set 声明为变量,而不是类型别名。 "我想通过向量维护多个链表。" - 那就是std::vector&lt;std::list&lt;T&gt;&gt; 还有什么让你使用using namespace std;std::set模板变得更糟。 typedef long long ll; -- 不要从在线竞赛网站上学习坏习惯。不需要这样的宏。只需使用int64_t 【参考方案1】:
vector < block* > set;

这会创建一个set 变量,它的类型是vector &lt; block* &gt;,但您正在尝试像使用类型一样使用set

如果您想为set 创建类型别名,请尝试:

using set = std::vector < block* > 

但我不知道你为什么不使用标准的std::set模板

【讨论】:

std::set 不是 OPs std::vector&lt;block*&gt; 的替代品,set 可能不是最好的名字【参考方案2】:

“我想通过向量维护多个链表。”

不,这不是办法。


vector < block* > set;

这是一个名为 set 的变量。

void insert(set cashblock, ll tag1=-1,bool d=0) 

这是一个接受 名为 set 的类型作为参数的函数。

简单地修复你的错误:

#include <vector>


typedef long long  ll;
struct block

  ll tag;
  bool valid_bit;
  bool dirty_bit;
  block* next;
  block* prev;
;

using set = std::vector< block* > ; //very bad name, imagine using namespace std, the confusion...
set my_set;

// Function to Insert new block in the set
void insert(set cashblock, ll tag1=-1,bool d=0)  ... 

bool find(set tmp,ll tag1)  ... 

我需要访问向量中的第 0 个元素,它是一个指针 到一个链表。它应该像 set[0]->tag

要访问向量中的第一个元素是指向链表的指针哪些元素是指向结构*的指针,是的,您可以设置[0]->tag

【讨论】:

以上是关于指向结构的指针向量的主要内容,如果未能解决你的问题,请参考以下文章

使用 push_back() 时指针向量指向 NULL

C++:使用 int 指针指向在函数内部创建的向量

将指向向量向量的指针移动到特定位置

c++ 内存分配向量的指针

如何创建指向向量的指针向量

我是不是正确删除了指向对象的指针向量?