Заполните вектор с помощью массива - PullRequest
0 голосов
/ 11 января 2020

Я учусь использовать векторы в C ++, используя в этом посте , и они привели приведенный ниже пример заполнения вектора с помощью массива. Синтаксис немного сбивает с толку, хотя.

#include <iostream>
#include <string>
#include <vector>

int main() {
    // Array of string objects
    std::string arr[] = {
        "first",
        "sec",
        "third",
        "fourth"
    };

    // Vector with a string array
    std::vector < std::string > vecOfStr(arr,arr +sizeof(arr) / sizeof(std::string)); //This line is confusing
    for (std::string str: vecOfStr)
        std::cout << str << std::endl;
}

Насколько я понимаю, сразу после имени переменной для вектора появляется размер вектора. Я предположил бы, что это было бы просто sizeof(arr) / sizeof(std::string), но вместо этого arr,arr +sizeof(arr) / sizeof(std::string). Кто-нибудь может сказать мне, почему?

Ответы [ 2 ]

5 голосов
/ 11 января 2020

std::vector имеет несколько конструкторов, которые вы можете выбрать. Один из конструкторов действительно получает длину вектора. В вашем примере используется другой конструктор. Тот, который получает два итератора.

Вы передаете конструктору два указателя std::string, которые служат итераторами.

Операторы сложения и деления являются просто арифметикой указателей.

3 голосов
/ 11 января 2020

Используйте std::array. Затем вы можете заполнить вектор следующим образом:

std::vector<std::string> vecOfStr(arr.begin(), arr.end());

Выйдите из привычки использовать массивы C -тиля.

Также; если вы настаиваете на использовании массивов в стиле C, то, по крайней мере, используйте std::size(), если вам нужно количество элементов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...