Обязательно ли иметь шаблон функции для передачи std::vector
в качестве аргумента, как в приведенном ниже коде?
Кроме того, почему нам нужно передавать <T>
вместе с std::vector
в параметре?
template <typename T>
void print_vec(const std::vector<T>& vec){
for(size_t i{}; i < vec.size();++i){
std::cout << vec[i] << " ";
}
std::cout << std::endl;
}
int main(){
//Constructing vectors
std::vector<std::string> vec_str {"The","sky","is","blue","my","friend"};
std::cout << "vec1[1] : " << vec_str[1] << std::endl;
print_vec(vec_str);
}
Вы вызываете его только с помощью std::vector<std::string>
или, например, с помощью std::vector<int>
? Если только с единицей, то void print_vec( const std::vector<std::string>& vec)
— достаточная функция.
Я предполагаю, что вы имеете в виду «обязательно ли добавлять <std::string>»... Нет, это не так, но тогда это будет считаться std::vector<const char*>
Честно говоря, я не понимаю, что вы имеете в виду под «нужно передать вместе с std::vector
». Можете ли вы это перефразировать? Чего бы вы ожидали или сделали вместо этого?
ок, понял, спасибо всем. Функция типа шаблона потребуется только в том случае, если мы хотим позже использовать ту же функцию для других типов данных.
Обратите внимание, что в С++ 20 вы можете использовать этот синтаксис: и это в основном ограничивает ваш шаблон чем-либо «итерируемым» Это также показывает, что в случае диапазонов (векторов) вам действительно следует использование диапазона на основе циклов for. (К сожалению, большинство курсов C++ несколько устарели и не показывают вам этого)
#include <vector>
#include <ranges>
#include <iostream>
// Use C++20 template/concept syntax
auto print_all(std::ranges::input_range auto&& values)
{
for(const auto& value : values)
{
std::cout << value << "\n";
}
}
int main()
{
std::vector<std::string> values{"1","2","3"};
print_all(values);
}
Я считаю, что это должно быть неконстантным auto &&values
, некоторые стандартные представления имеют неконстантный begin()/end()
. Кроме того, ranges::input_range
, вероятно, немного лучше, чем просто range
.
@HolyBlackCat Справедливые замечания ;) Обновлено
Также стоит упомянуть std::span
в качестве альтернативы. Иногда шаблоны могут оказаться излишними.
Нет, это не обязательно . Автор считал, что шаблон print_vec
более полезен, чем шаблон print_vec
, предназначенный специально для std::vector<std::string>
.
Если вы хотите быть независимым от типа значения переданного вектора: да.