Как по умолчанию инициализировать std :: vector - PullRequest
5 голосов
/ 07 января 2020

При попытке по умолчанию инициализировать std :: vector

#include <iostream>
#include <vector>
int main()
{    
    class Options
    {
        std::vector<int> items{100};
    } options ;

    std::cout << "Size:" << options.items.size() << " Items[0]:" << options.items[0] << '\n';

    return 0;
 }

При этом будет напечатано:

Размер 1: Элементы [0]: 100

Но это не так что я хочу, я хочу, чтобы вектор имел размер 100.

Мне удалось сделать это с помощью

class Options
{
    std::vector<int> items{ std::vector<int>(100) };
} options ;

Но я чувствую, что должен быть "лучший" способ?

С уважением,

Ответы [ 4 ]

7 голосов
/ 07 января 2020

Единственный способ инициализировать члена класса в теле класса - заключить его в скобки или равнозначно. Это означает, что вы можете сделать

std::vector<int> items{ std::vector<int>(100) };

или

std::vector<int> items = std::vector<int>(100);

Если вам не нравится ни одна из этих опций, вы можете добавить инициализатор в конструктор классов и иметь

class Options
{
    Options() : items(100) {}
    std::vector<int> items;
} options ;

но лично я бы вместо этого использовал первые два варианта.

2 голосов
/ 07 января 2020

Чтобы избежать путаницы из-за различий в поведении между

std::vector<int> items(100);

и

std::vector<int> items{100};

, используйте

std::vector<int> items;
items.resize(100);       //Default initializes 100 int <=> zero
// or
items.resize(100, 17);   //Initializes 100 ints with value 17

Используется в конструкторе

class Options
{
    std::vector<int> items;

public:
    Options()
    {
        items.resize(100);
    }
} options;
0 голосов
/ 07 января 2020

измените ваш код следующим образом:

std::vector<int> items(100,0);

Это создаст вектор с размером 100 и инициализирует все со значением 0

0 голосов
/ 07 января 2020
class Options
{
    std::vector<int> items;
public: 
    Options() : items(100) {}
}

: запускает инициализацию списка членов, создавая элементы в порядке, в котором они объявлены в классе, перед началом тела конструктора.

...