我的问题是:我可以做什么而不是跟随? 我想创建一个向量,使每个框都是链表的头部,'insert_beg'是一个在list的开头插入元素(x)的函数。我必须初始化由NULL创建的每个框。
struct list
{
int info;
list* suivant;
};
void insert_beg(list* &debut,int x){
list* nouveau;
nouveau = new list;
nouveau->info = x;
nouveau->suivant = debut;
debut = nouveau;
}
int main()
{
int n=5;
vector<list*> tab;
for(int i=0;i<n;i++){
x=n*2;
tab.puch_back(?);
insert_beg(tab[i],x);
}
}
答案 0 :(得分:0)
如果我已正确理解了这个问题,那么您需要以下内容。
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
struct list
{
int info;
list* suivant;
};
void insert_beg( list * &head, int info )
{
head = new list { info, head };
}
int main()
{
const int N = 5;
std::vector<list *> tab;
tab.reserve( N );
std::fill_n( std::back_inserter( tab ), N, nullptr );
std::for_each( tab.begin(), tab.end(),
[=]( list * &head ){ insert_beg( head, 2 * N ); } );
std::for_each( tab.begin(), tab.end(),
[]( const list * head ) { std::cout << head->info << ' '; } );
return 0;
}
程序输出
10 10 10 10 10
最初,向量中列出的所有指针都应由nullptr
初始化。
您只需调用标准算法std::fill_n
std::fill_n( std::back_inserter( tab ), N, nullptr );
如果您的编译器不支持文字nullptr
,那么您可以通过以下方式重写上述调用
std::fill_n( std::back_inserter( tab ), N, ( list * )0 );
答案 1 :(得分:0)
如果你想让insert_beg完成列表的所有初始化工作,你可以(确保insert_beg处理nullptr情况)
fun example3 (list : { foo: int * string } list) =
case list of
head as { foo as (i, s) } :: tail => ()
(* This is valid, too, but `foo` is not a binding. *)
| head as { foo = (i, s) } :: tail => ()
(* Here, `f` is bound to the whole tuple value. *)
| head as { foo = f as (i, s) } :: tail => ()
| nil => ()
tab是list *的std :: vector,所以你也可以推回列表*
tab.push_back(nullptr);
然后您可以使用operator []访问头部并修改头部信息和suivant:
tab.push_back(new list);
您还可以使用列表类的构造函数在一行中执行上述操作。
tab[i]->info = x;
tab[i]->suivant = nullptr;
答案 2 :(得分:0)
这是'insert_beg'函数的外观:
void insert_beg(list* &debut,int x){
list* nouveau;
nouveau = new list;
nouveau->info = x;
nouveau->suivant = debut;
debut = nouveau;
}