如何以这种方式使用矢量?

时间:2011-11-22 13:50:41

标签: c++ vector stdvector

有人可以解释一下这段代码吗?函数栏如何接受对向量的第一个元素的引用?

jintArray arry;
std::vector<int> foo = GetIntegerArray(env, arry);
bar(&foo[0])

栏的原型是

bar(int* array)

4 个答案:

答案 0 :(得分:5)

只要模板类型不是bool,这就有效。 C ++向量类型指定向量元素在内存中是连续的,这样你就可以做到这一点。

它不能与bool一起使用的原因是模板专业化。将bool压缩到一个位域。

http://en.wikipedia.org/wiki/Vector_%28C%2B%2B%29#vector.3Cbool.3E_specialization

答案 1 :(得分:3)

  

函数栏如何接受对向量的第一个元素的引用?

这似乎是混乱的根源。表达式&foo[0]不是对第一个元素的引用,而是指针。 operator[]类中重载vector以获取引用(或const-reference),应用&将获取对象的地址。

答案 2 :(得分:2)

是。只需确保向量不为空,否则&foo[0]将出错。 C ++ 11引入了没有此问题的std::vector<T>::data()函数。

此外,按值返回向量通常不是一个好主意。您可能希望在GetIntegerArray中使用输出迭代器或向量引用参数,因此您可以这样调用它:

std::vector<int> foo;
GetIntegerArray(env, arry, back_inserter(foo));

std::vector<int> foo;
GetIntegerArray(env, arry, foo);

答案 3 :(得分:1)

使用std::vector<int>时,可以保证所有元素都在连续内存中创建。因此,当您编写&v[0]时,它会返回指向第一个元素的指针,然后您可以通过编写&v[0]+1来查找下一个元素,依此类推。

顺便说一句,如果你想遍历所有元素或一部分元素,那么bar的更好的界面就是:

void bar(int *begin, int *end)
{
     for ( ; begin != end; ++begin)
     {
         //code
     }    
}

所以你可以这样打电话:

bar(&foo[0], &foo[0] + foo.size());//process all elements
bar(&foo[0], &foo[0] + foo.size()/2);//process first half elements
bar(&foo[0], &foo[0] + N); //process first N elements(assumingN <=foo.size())
bar(&foo[0]+foo.size()/2, &foo[0]+foo.size());//process second half elements