我正在通过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) {
答案 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);