Различные способы создания std :: vector на лету и передачи его в другую функцию - PullRequest
0 голосов
/ 20 мая 2018

Я испытываю различные способы создания std::vector на лету и передачи его другой функции:

#include <iostream>
#include <vector>

void print(std::vector<int> a)
{
    std::cout << a.size() << '\n';
}

int main()
{
    print({1, 2, 3, 4, 5});
    print(std::vector<int>{1, 2, 3, 4, 5});
    print(std::vector<int>({1, 2, 3, 4, 5}));
}

Это дает желаемый результат:

$ clang++ -std=c++11 foo.cpp && ./a.out
5
5
5

Iхочу знать, в чем различия между этими тремя вызовами:

print({1, 2, 3, 4, 5});
print(std::vector<int>{1, 2, 3, 4, 5});
print(std::vector<int>({1, 2, 3, 4, 5}));

Вот еще один пример:

#include <iostream>
#include <vector>

int main()
{
    std::vector<int> a = {1, 2, 3, 4, 5};
    // std::cout << (a == {1, 2, 3, 4, 5}) << '\n'; // error
    std::cout << (a == std::vector<int>{1, 2, 3, 4, 5}) << '\n';
    std::cout << (a == std::vector<int>({1, 2, 3, 4, 5})) << '\n';
}

Вот вывод:

$ clang++ -std=c++11 foo.cpp && ./a.out 
1
1

IЯ надеюсь, что ответ на этот вопрос может стать хорошим справочным ответом на эту тему, где в ответе обсуждаются следующие аспекты этих вызовов:

  • Три вышеупомянутых и любые другие подобные способы прохождения std::vector к другой функции.
  • Семантические различия между различными методами.
  • Различия в производительности (если есть) между различными методами.
  • Лучшие практики (если есть), из-за которыходин вызов предпочтительнее другого.

Если вы считаете, что у вопроса есть какие-либо недостатки, пожалуйста, не стесняйтесь редактировать вопрос и улучшать его.

1 Ответ

0 голосов
/ 20 мая 2018

Начиная с C ++ 17, все они имеют одинаковый эффект.Вызывается функция print, и аргумент функции создается путем вызова конструктора vector(std::initializer_list<int>).

Первый из них, вероятно, будет считаться предпочтительным синтаксисом, поскольку он избегает избыточности.

До C ++ 17 могли создаваться и уничтожаться различные временные объекты, но это все в прошлом.

...