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

Does a vector behave the same was as an array when dealing with pointers?

本文关键字:是否 数组 指针 处理 vector      更新时间:2023-10-16

一个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++书,所以我猜这是书中的一个错误。

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

*


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

No。这说不通啊。没有从T*std::vector<T>的隐式转换。

但是在c++ 11中,你可以做一些非常接近1的事情。可以动态地创建vector,同时将实参传递为:

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

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


<一口> 1。非常接近,因为您只需再键入一个字符就可以使代码正常工作。不输入&,只输入{,最后再输入一个}。就是这样。c++ 11让生活变得如此简单。

不,这是相当幸运的,因为C数组的行为是令人讨厌的。如果你发现自己在寻找它,我建议你去找一些新的学习材料,比如c++。

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

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

可以这样调用:

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

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


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

// (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版本可能会稍微优化,但我不确定)。