0

一个vector简单的指针的名称,就像一个普通的 C 数组?

因此,我可以将地址发送到单个非向量数据(换句话说,一个指针)到一个期望 a 的函数参数,vector因为 avector也是一个指针。

例如,声明如下的函数:

void RenderingEngine::Render(const vector<Visual>& visuals) const{

可以这样调用:

Visual visual; // is NOT a vector
//do stuff with visual
m_renderingEngine->Render(&visual); 

有意义并且是有效的、合法的 C++?

此示例代码来自 O'Reilly C++ 书籍,所以我猜这是书中的错误。

4

4 回答 4

2

向量的名称是否只是一个指针,就像普通的 C 数组一样?

不,这是一个完整的类。*


* 更重要的是,一个普通的 C 数组也不是一个指针(在大多数情况下它只是变成一个)。

于 2013-01-05T13:38:39.810 回答
1

不,这没有意义。没有从T*to的隐式转换std::vector<T>

但是在 C++11 中,你可以做一些与你正在做的事情非常接近的事情1 。您可以在将参数传递为时动态创建向量:

m_renderingEngine->Render( {visual} );  //note the curly braces!

这样,您就可以从表达式中创建一个向量对象{visual},然后将其传递给函数。


1.非常接近,您只需再输入一个字符即可使您的代码正常工作。不用输入&,只需输入{,最后再输入一个}。这就对了。C++11 让生活变得如此轻松。

于 2013-01-05T13:40:08.000 回答
1

不,它不是,这是相当幸运的,因为 C 数组的行为是可恶的。如果您发现自己正在寻找它,我建议您寻找一些新的 C++ 学习材料。

于 2013-01-05T13:47:17.237 回答
1

其他答案是正确的,但我想补充一点,它可以反过来工作:

void RenderingEngine::Render(Visual *visuals, size_t n_visuals);

可以这样调用:

vector<Visual> visuals;
m_renderingEngine->Render(&visuals[0], visuals.size());

您只需获取第一个元素的地址并将其作为数组传递即可。这是有效的,因为向量的元素在内存中是按顺序排列的。(正如评论中指出的那样,当然不应该在新代码中使用它。定义你的方法来获取向量更安全,更容易。但是,如果你已经有一个接受指针的遗留函数,这允许你在您自己的代码中使用向量。)


它以这种方式工作的原因,而不是您问题中的方式(将指针传递给接受向量的函数),是因为在您的情况下,它无法在运行时确定数组的大小。但它必须知道构造向量的大小:

// (wrong code)
// Passing one element:
Visual visual;
m_renderingEngine->Render(&visual);

// Passing two elements, how does Render know that
// there are two elements at that address?
Visual[2] visuals;
m_renderingEngine->Render(&visuals[0]); 

正如 Nawaz 指出的,您可以在 C++11 中执行类似的操作:

Visual visual;
m_renderingEngine->Render( {visual} ); // C++11

您还可以在{}. 这只起作用,因为编译器可以在编译时告诉有多少元素。它只是语法糖:

vector<Visual> myVec = {visual};  // C++11
m_renderingEngine->Render(myVec);

反过来又像经典一样工作:

vector<Visual> myVec;
myVec.push_back(visual);
m_renderingEngine->Render(myVec);

(虽然 C++11 版本可能会稍微优化,但我不确定)。

于 2013-01-05T13:54:47.240 回答