在处理指针时,vector的行为是否与数组相同?
Does a vector behave the same was as an array when dealing with pointers?
一个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版本可能会稍微优化,但我不确定)。
- 如何找到大小'x'数组是否完全填充,在C++?
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 是否基于数组B整数打印数组A中的整数
- 检查TCHAR数组输入是否为带符号整数C++
- 堆栈和队列是否像C++中的数组一样传递?
- 在函数范围内在堆栈上分配的数组在离开函数时是否总是被释放?
- 是否假定reinterpret_cast<char*>(myTypePtr)指向数组?
- 如果分配数组引发异常,是否应该释放该数组
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 我是否不正确地集中了这些字符数组?
- 是否可以就地构造一个固定大小的数组作为函数参数?
- 在 c++ 中是否允许创建具有运行时边界的数组?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 给定一个大小为 N 的数组 S,检查是否可以将序列拆分为两个序列
- C++:在多个线程中访问同一数组/向量的不同单元格是否会产生数据竞赛?
- 将对象的字节复制到数组并再次复制回来是否安全
- 是否可以将结构数组别名为结构成员数组?
- 当另一个数组是内存集时,内存集是否会更改数组长度?
- 任意大小的 constexpr 数组是否可以用作 switch 语句中的案例?