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 ++书籍,所以我想这是书中的错误。
答案 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版本可能稍微优化,但我不确定)。