вектор <string>против строки [] при переходе к функции - PullRequest
0 голосов
/ 23 мая 2018

Я новичок в C ++ и пытаюсь передать коллекцию строк с неизменяемой суммой в функцию, которая существует в отдельном файле класса, в удобном для чтения виде:

//main in Caller.cpp
int main()
{
   string details[] = {"Name","Height","Weight"};

    /* vector<string> detailsV = {"Name","Height","Weight"}; 
     * Would like to use a vector but can't do this because vector cannot be 
     * initialized to = {...} in C++
     */

   Person p = Person();
   p.inspectDetails(details);
}

//Person class in Person.cpp
void inspectDetails(string details [])
{
   int sz = sizeof(details); // this will result in details = "Name" only
}

Я пробовал:

//Person class in Person.cpp
<template size_t N>
void inspectDetails(string (&details)[N])
{
   int sz = sizeof(details); 
}

Однако я сейчас не знаю, как сообщить main в классе Caller о <template size_t N>, который может позволить мне использовать массив неявного количества,Кажется, я получаю сообщение об ошибке «нет подходящего преобразования std: string [3] в std: string» при попытке вызвать inpectDetails таким образом.

Каков наилучший способ передать коллекцию строк неявного количества в функцию вне класса Caller, при этом сохраняя возможность жестко кодировать содержимое коллекции, как, например, Collection c = {"...", "...", "..."} в C ++?Есть ли более простой способ передать полную коллекцию строк в функцию с указателем на вектор или что-то в этом роде?

Ответы [ 3 ]

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

Передача по константной ссылке является опцией.Вот как может выглядеть возможная программа:

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

void inspectDetails( const std::vector<std::string> & details )
{
    int v = details.size();
    std::cout<<v<<std::endl;
}

int main()
{
    std::vector<std::string> details = {"name", "height", "weight"};

    inspectDetails(details);

    return 0;
}
0 голосов
/ 24 мая 2018

Роб К ответил прямо на ваш вопрос.Я добавлю, что иногда полезно использовать std :: array вместо простого массива: http://en.cppreference.com/w/cpp/container/array Например, вы можете легко узнать размер вашего массива.

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

Используйте std::vector< std::string > и передайте его по ссылке, если вам нужно изменить его содержимое, или по ссылке, если вам не нужно их менять.Это самый простой, гибкий и понятный способ.

Таким образом:

void inspectDetails( std::vector< std::string > & details );

std::vector< std::string > details = { "Name","Height","Weight" };
inspectDetails( details );

ср.http://en.cppreference.com/w/cpp/container/vector

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