填充C ++二维对象数组

时间:2015-03-19 14:23:22

标签: c++ arrays

我对std :: fill有一个简单的问题。

首先,我定义了一对二维数组。

const int NMAX = 13;                                                             
typedef pair<int, set<int>> solution;                                            
solution memo[NMAX][NMAX];    

我假设在那个阶段我的数组是用默认的对构造函数初始化的。然后,我想初始化这个数组而不依赖于嵌套循环。我在做的是:

solution s;                                                                  
s.first = -1;                                                                                                 
std::fill( &memo[0][0], &memo[0][0] + sizeof(memo), s); 

但我得到一个公共汽车错误......我做错了什么?

2 个答案:

答案 0 :(得分:2)

您的结束指针错误,您的意思是:

std::fill(&memo[0][0], &memo[0][0] + sizeof(memo) / sizeof (solution), s);

sizeof(memo)NMAX * NMAX * sizeof (solution)

答案 1 :(得分:1)

实际上,我们可以使用std::vector轻松完成所有这些工作:

typedef pair<int, set<int>> solution; 
solution s;                                                                  
s.first = -1;
std::vector<std::vector<solution>> memo(NMAX, std::vector<solution>(NMAX, s));

Live Demo

除非你对使用std::vector有一些限制,否则使用它会更容易,而不是做一堆指针数学。

修改:使用std::array也不是最糟糕的主意,例如πάντα ῥεῖ建议。您可以避免编写内部循环以使用std::for_each自行执行填充,如下所示:

std::array<std::array<solution, NMAX>, NMAX> memo;
solution s;                                                                  
s.first = -1;
std::for_each(std::begin(memo), std::end(memo), [&s](std::array<solution,NMAX>& next){next.fill(s);})

Demo 2

编辑2:如果你真的是受虐狂并希望自己计算[row] [column]指数,那么你可以使用单std::array<solution, NMAX*NMAX>并利用{{1和} std::begin()调用std::end()

std::fill

Demo 3