2016-05-10 2 views
0

Как мы знаем, в C++, мы можем повторно инициализировать массив arr от размера N со значением 0, как,Как повторно инициализировать массив структуры?

fill (arr, arr + N, 0); 

Но мне нужно повторно инициализировать массив с struct S,

struct S { 
    int b[2]; 
} 

Действительное код,

#include <iostream> 

using namespace std; 

struct Dog 
{ 
    int count[2]; 
}; 

int main(){ 
    ... 
    Dog dogs[N]; 

    ... 
    while (T--) 
    { 
     ... 
     for (int i = 0; i < M; ++i) 
     { 
      fill(dogs, dogs+N, {0}); 
      ... 
     } 
     ... 
    } 
} 
+0

У вас возникли проблемы с 'std :: fill'? – juanchopanza

+0

используйте 'fill' то же самое –

+0

@ M.M @juanchopanza, используя fill like,' fill (arr, arr + N, {0}) 'вызывает массив. Я знаю, что синтаксис не имеет смысла, мне нужно создать временную структурную переменную для инициализации? – swappy

ответ

0

Для случая:

struct Dog { int count[2]; }; 

Dog dogs[N]; 

вы можете использовать:

std::fill(dogs, dogs+N, Dog{}); 

Третий аргумент fill должен иметь правильный тип уже, компилятор не выводит тип из итератора. Поэтому вы не можете просто использовать {} или {0}.

Рассмотрите возможность использования std::begin(dogs), std::end(dogs) вместо dogs, dog+N, поскольку это исключает возможность использования неправильного значения для N.


Я не уверен, почему fill был разработан таким образом, как это, конечно, можно написать функцию, которая делает принимает список инициализации, а также нормальные значения:

#include <algorithm> 

template<typename It> 
void mfill(It begin, It end, typename std::remove_reference<decltype(*begin)>::type const &v) 
{ 
    std::fill(begin, end, v); 
} 

struct Dog { int count[2]; }; 

int main() 
{ 
    Dog dogs[5]; 
    mfill(dogs, dogs+5, {}); 
} 
0

Вы можете использовать fill_n следующим образом:

struct Dog 
{ 
    int count[2]; 
}; 

int main(){ 

    Dog dogs[4] = {}; 
    dogs[0].count[0] = 1; 

    std::fill_n(dogs, 0, Dog{}); 

} 

поскольку Dog является стручок структура, вы можете по умолчанию построить его в последнем параметре fill_n

Смежные вопросы