vector <string> x之间的区别;和vector <string> x(const string&amp; s){}

时间:2018-03-20 15:01:10

标签: c++ function parameters declaration

我正在通过Andrew Koenig和Barbara Moo学习Accelerated C++中的向量。任何人都可以解释这些之间的区别吗?

vector<string> x;

vector<string> x(const string& s) { ... }

第二个是否定义了一个函数x,其返回类型必须是一个向量,并且其返回值以某种方式存储在x中?

本书的确切代码如下所示:

map<string, vector<int> > xref(istream& in, vector<string> find_words(const string&) = split) {

3 个答案:

答案 0 :(得分:3)

vector<string> x;

这是类型为x

的名为vector<string>的变量的声明
vector<string> x(const string& s) { ... }

这是一个名为x的函数,它接受const string&类型的1个参数并返回vector<string>

你可以看到他们是不同的野兽。

答案 1 :(得分:1)

似乎是这个功能定义

map<string, vector<int> > xref(istream& in, 
                               vector<string> find_words(const string&) = split) 
{
    //...
}

让你感到困惑。

第二个参数具有默认参数vector<string>(const string&)提供的函数类型split

考虑到您可以使用函数指针类型而不是函数类型。在任何情况下,编译器都会将具有函数类型的参数调整为具有函数指针类型的参数。

考虑这个示范程序。两个函数声明声明了相同的一个函数。在第一个函数声明中,第二个参数使用了函数类型,而在第二个函数声明中,使用了同一参数的函数指针类型。

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

using namespace std;

vector<string> split( const string & );

map<string, vector<int> > xref( istream& in, 
                                vector<string> find_words(const string&) = split );

map<string, vector<int> > xref( istream& in, 
                                vector<string> ( *find_words )(const string&) );

int main() 
{

    return 0;
}

我只声明函数split而没有提供它的定义,因为这个简单的演示程序不需要它。

所以你可以用一个参数调用函数xref,在这种情况下,函数默认使用函数split作为第二个参数。或者您可以显式指定第二个参数,将其设置为您自己的书面函数的名称。

答案 2 :(得分:0)

你是正确的,因为后者是一个功能。然而,函数vector创建的x不存储在名为x的变量中,而是函数本身名为x。您可以执行以下操作:

string my_str = "Hello world.";
// Call x to create my_vector:
vector<string> my_vector = x(my_str);