Какой конструктор std :: vector используется здесь? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть кусок кода (взято с https://vulkan -tutorial.com / Drawing_a_triangle / Setup / Validation_layers ):

uint32_t glfwExtensionCount = 0;
const char** glfwExtensions;
glfwExtensions = glfwGetRequiredInstanceExtensions(&glfwExtensionCount);

std::vector<const char*> extensions(glfwExtensions, glfwExtensions + glfwExtensionCount); // which constructor is used here?

Все компилируется и работает, но я не понимаю, что происходит в конструкторе векторов.

Ответы [ 2 ]

4 голосов
/ 03 июня 2019

Это

template< class InputIt >
vector( InputIt first, InputIt last,
        const Allocator& alloc = Allocator() );

(# 4 в https://en.cppreference.com/w/cpp/container/vector/vector). Он строит вектор из диапазона входных итераторов.

Итераторы C ++ были разработаны для совместимости с указателями, т.е. указатель является допустимым итератором.

3 голосов
/ 03 июня 2019

В приведенном выше определении вектора используется конструктор range. подпись равна

template <class InputIterator>
  vector (InputIterator first, InputIterator last,
          const allocator_type& alloc = allocator_type());

например:

int main() {
  int a[] = {1, 2, 3};
  vector<int> v(a + 1, a + 3);
  for (int x : v) {
    cout << x << endl;
  }
  return 0;
}

Сборка и запуск дает ( источник )

2
3

Итератор начинался с begin + 1 до последней позиции, поэтому первый элемент в конструкции вектора опускается.

...