错误:无法将std :: vector <std :: basic_string <char >>转换为std :: string *

4

作为一个C++新手,我试图在我的程序中创建一个简单的void函数来显示一个数组。然而,正如标题所示,出现了错误。我相信问题在于我尝试使用不同于函数参数形式的数组进行调用。我不确定该如何修改。

#include <iostream>
#include <vector>

using namespace std;

void display_array(string arr[]){
    int i;
    for (i = 0; i < sizeof(arr); i++);
        cout<<arr[i];
}

int main()
{
    string current;
    std::vector<string> paths;

    cout<<"Input paths in the form 'AB'(0 to exit)";
    cin>>current;
    while (current != "0"){
        paths.push_back(current);
        cin>>current;
    }
    display_array(paths);
}

非常感谢您的帮助。


1
如果 display_array 应该打印一个 std::vector<std::string>,则将参数设置为 const std::vector<std::string>>& - Baum mit Augen
1
请注意,您的 for 循环末尾有一个分号,这意味着循环除了递增 i 之外什么也不做,下一行代码只会执行一次。 - sjdowling
4个回答

4
问题在于函数display_array需要一个string[]作为参数,但是你传递了一个std::vector<std::string>。你可以通过将display_array函数更改为接受一个字符串向量的常量引用而不是数组来解决这个问题:
void display_array(const std::vector<string>& arr) {
    for (auto it = arr.begin(); it != arr.end(); it++)
        cout<<*it;
}

我们之所以传递一个常量引用而不是按值传递向量的原因是,我们不会改变向量并且不想复制它。在可能的情况下使用const是一个好习惯,并考虑复制参数的成本。


0

在C++出现之前,函数display_array的符号已经存在于C中,由于C++向后兼容C,因此它也可以在C++中编译。

不幸的是,这种方法相当危险,因为直觉上,它会导致初学者像你一样犯错误。

实际上,您可以将[]替换为指针,使其接受string*。而且大小也是指针的大小,而不是数组中传递的元素数量。

您的选择是传递指针和大小,或者在范围内传递两个指针,其中最后一个指针是“序列结束后的一个”。

如果您使用的是C++03,则必须使用&arr[0]才能访问第一个元素。在C++11中,您有arr.data()作为一种方法,即使向量为空时也可以安全调用。(从技术上讲,如果向量为空,即使您从未尝试引用此指针,&arr[0]也是未定义的行为)。

因此,以下更正将使您的代码在C++03中工作:

void display_array(const string *arr, size_t size )
{
    int i;
    for (i = 0; i < size; i++) // no semicolon here..
       cout<<arr[i];
}

并将其命名为:

if( !paths.empty() )
      display_array( &paths[0], paths.size() );

0

display_array 函数接受一个数组,应该接受一个 std::vector

void display_array(std::vector<string> arr) {
    for (auto s : arr)
        std::cout << s;
}

-2

你应该编辑你的函数签名为:

void display_array(vector<string> &arr)

并且:

for (i = 0; i < arr.size(); i++)

1
删掉 for 行末尾的 ; - Angew is no longer proud of SO
2
那应该是一个const引用。 - juanchopanza
@juanchopanza,由于OP很新,保持简单并不添加“const”概念可能更好。 - dmg
@dmg 我不同意。const && 是如此根本上不同,早期学习它们是 C++ 技能的关键之一。在函数参数中写 & 而不是 const & 实际上是实际代码中的严重问题,程序员甚至不应该在开始时学习这个。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接