有人可以解释一下这段代码吗?函数栏如何接受对向量的第一个元素的引用?
jintArray arry;
std::vector<int> foo = GetIntegerArray(env, arry);
bar(&foo[0])
栏的原型是
bar(int* array)
答案 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