传递对 STL 向量中偏移位置的引用
Passing a reference to an offset position in an STL vector
我正在尝试将一些旧的 C 函数转换为 C++。我的原始程序将矩阵存储在单个数组中,我只是将指向第一个元素的指针传递给函数,以便我在正确的行上工作,例如
double f1(int *a){
return a[0] + a[1];
}
int main(void){
int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(i = 0; i < 5; i++){
printf("%d\n", f1(&x[2 * i]));
}
我希望能够使用 STL 而不 复制来做类似的事情。所以我的程序看起来像这样
double f1(vector<int>& a){
return a[0] + a[1];
}
int main(void){
int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> y(x, x + 10);
for(i = 0; i < 5; i++){
cout << f1(y) << endl; // This is clearly wrong
}
我该怎么做?我想我可以更改我的函数以接收对 vector::iterator 的引用,但还有其他方法吗?
您可以简单地将迭代器传递给函数。随机访问迭代器与指针非常相似(事实上,指针符合随机访问迭代器的条件。)例如,
#include <vector>
double f1(std::vector<int>::const_iterator a)
{
return a[0] + a[1];
}
#include <iostream>
int main()
{
vector<int> y{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto it = y.cbegin();
for(int i = 0; i < y.size()/2; ++i)
std::cout << f1(it + 2*i) <<std::endl;
}
写数组视图。数组视图是一对具有 begin
end
size
empty
、operator[]
、front
和 back
方法的指针,并且来自 C 数组的构造函数,std::array<T,N>&
、std::vector<T,A>&
、std::vector<non_const_T,A>const&
、std::array<non_const_T,N>const&
、std::initializer_list<non_const_T>
等
哦,还有 T*,size_t
和 T*,T*
ctors,它们非常适合切片(使用转发 ctors:T*,size_t
->T*,T*
,以及那些 2 ).
它不拥有自己的数据,所以它的所有方法都是 const
除了 operator=
。 (非 const
方法是更改视图范围的方法——更改元素是对视图的 const
操作)。
然后
double f1(array_view<const int> a){
return a[0] + a[1];
}
你不需要做那么多的改变:
double f1(int *a)
{
return a[0] + a[1];
}
int main(void)
{
vector<int> y = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 5; i++) {
cout << f1(&y[2 * i]) << endl;
}
}
我正在尝试将一些旧的 C 函数转换为 C++。我的原始程序将矩阵存储在单个数组中,我只是将指向第一个元素的指针传递给函数,以便我在正确的行上工作,例如
double f1(int *a){
return a[0] + a[1];
}
int main(void){
int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for(i = 0; i < 5; i++){
printf("%d\n", f1(&x[2 * i]));
}
我希望能够使用 STL 而不 复制来做类似的事情。所以我的程序看起来像这样
double f1(vector<int>& a){
return a[0] + a[1];
}
int main(void){
int x[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
vector<int> y(x, x + 10);
for(i = 0; i < 5; i++){
cout << f1(y) << endl; // This is clearly wrong
}
我该怎么做?我想我可以更改我的函数以接收对 vector::iterator 的引用,但还有其他方法吗?
您可以简单地将迭代器传递给函数。随机访问迭代器与指针非常相似(事实上,指针符合随机访问迭代器的条件。)例如,
#include <vector>
double f1(std::vector<int>::const_iterator a)
{
return a[0] + a[1];
}
#include <iostream>
int main()
{
vector<int> y{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
auto it = y.cbegin();
for(int i = 0; i < y.size()/2; ++i)
std::cout << f1(it + 2*i) <<std::endl;
}
写数组视图。数组视图是一对具有 begin
end
size
empty
、operator[]
、front
和 back
方法的指针,并且来自 C 数组的构造函数,std::array<T,N>&
、std::vector<T,A>&
、std::vector<non_const_T,A>const&
、std::array<non_const_T,N>const&
、std::initializer_list<non_const_T>
等
哦,还有 T*,size_t
和 T*,T*
ctors,它们非常适合切片(使用转发 ctors:T*,size_t
->T*,T*
,以及那些 2 ).
它不拥有自己的数据,所以它的所有方法都是 const
除了 operator=
。 (非 const
方法是更改视图范围的方法——更改元素是对视图的 const
操作)。
然后
double f1(array_view<const int> a){
return a[0] + a[1];
}
你不需要做那么多的改变:
double f1(int *a)
{
return a[0] + a[1];
}
int main(void)
{
vector<int> y = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int i = 0; i < 5; i++) {
cout << f1(&y[2 * i]) << endl;
}
}