处理指针时,向量的行为是否与数组相同?

时间:2013-01-05 13:36:59

标签: c++

vector的名称只是一个指针,就像一个香草C数组?

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

例如,声明为此的函数:

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 个答案:

答案 0 :(得分:2)

  

矢量的名称只是一个指针,就像一个香草C数组?

没有。这是一个完整的课程。 *

<小时/> *更重要的是,vanilla C数组也不是指针(在大多数情况下它只会变成一个)。

答案 1 :(得分:1)

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

但是在C ++ 11中,你可以做一些非常接近 1 的事情来做你正在做的事情。您可以在将参数传递为:

时动态创建矢量
m_renderingEngine->Render( {visual} );  //note the curly braces!

然后用表达式{visual}创建一个向量对象,然后传递给函数。


1。 非常接近,因为您只需键入一个字符即可使代码正常工作。不要打字&,而只需输入{,再输入一个}。这就对了。使用C ++ 11,生活如此简单。功能

答案 2 :(得分:1)

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

答案 3 :(得分: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版本可能稍微优化,但我不确定)。