Обязательно ли иметь шаблон функции для передачи std::vector в качестве аргумента?

Обязательно ли иметь шаблон функции для передачи 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);
}

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

Botje 07.05.2024 14:40

Вы вызываете его только с помощью std::vector<std::string> или, например, с помощью std::vector<int>? Если только с единицей, то void print_vec( const std::vector<std::string>& vec) — достаточная функция.

mch 07.05.2024 14:41

Я предполагаю, что вы имеете в виду «обязательно ли добавлять <std::string>»... Нет, это не так, но тогда это будет считаться std::vector<const char*>

Pepijn Kramer 07.05.2024 14:41

Честно говоря, я не понимаю, что вы имеете в виду под «нужно передать вместе с std::vector». Можете ли вы это перефразировать? Чего бы вы ожидали или сделали вместо этого?

Ulrich Eckhardt 07.05.2024 14:44

ок, понял, спасибо всем. Функция типа шаблона потребуется только в том случае, если мы хотим позже использовать ту же функцию для других типов данных.

Ussu20 07.05.2024 14:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
5
97
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Обратите внимание, что в С++ 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 07.05.2024 15:13

@HolyBlackCat Справедливые замечания ;) Обновлено

Pepijn Kramer 07.05.2024 15:26

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

Jan Schultke 07.05.2024 23:32
Ответ принят как подходящий

Нет, это не обязательно . Автор считал, что шаблон print_vec более полезен, чем шаблон print_vec, предназначенный специально для std::vector<std::string>.

Другие вопросы по теме