传递给函数时,vector <string> vs string []

时间:2018-05-23 20:07:54

标签: c++ arrays vector

我是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); 
}

但是,我现在不知道如何让Caller类中的main知道可能允许我使用非显式数组的<template size_t N>。我似乎得到一个错误&#34;没有合适的std:string [3]转换为std:string&#34;试图以这种方式拨打inpectDetails时。

将非显式数量的字符串集合传递给Caller类之外的函数的最佳方法是什么,同时保持在C ++中对集合的内容进行硬编码的能力,如Collection c = {"...", "...", "..."} ? 是否有更简单的方法将完整的字符串集合传递给具有指向矢量或某种类型的指针的函数?

3 个答案:

答案 0 :(得分:4)

如果您需要更改其内容,请使用std::vector< std::string >并通过引用传递它,如果您不需要更改它们,则使用const引用。这是最简单,最灵活,最清晰的方式。

因此:

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

答案 1 :(得分:0)

通过const引用传递是一个选项。这可能是一个可能的程序:

#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;
}

答案 2 :(得分:0)

Rob K回答你的问题。我将补充说,有时使用std :: array而不是简单数组是有用的:http://en.cppreference.com/w/cpp/container/array例如,您可以轻松地知道数组的大小。