传递对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("%dn", 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::迭代器的引用,但有其他方法吗?
您可以简单地将迭代器传递给函数。随机访问迭代器与指针非常相似(事实上,指针符合随机访问迭代器的条件。)例如,
#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*
因子,它们非常适合切片(使用转发因子:T*,size_t
->T*,T*
,以及这2个的所有其他因子)。
它不拥有自己的数据,所以除了operator=
之外,它的所有方法都是const
。(非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;
}
}
相关文章:
- 常量引用的内存位置
- 关于引用数组位置的问题
- Visual Studio 中的"指向引用的指针"错误不会按发生位置的文件名显示
- 包含具有无效位置的节点引用的方式
- 给定代码段中引用的时间和空间位置的所有出现
- 如何编写一个 void 函数,该函数将在数组中搜索值,并通过引用将该值的位置传递回 main 函数
- 不同的cclayer尺寸取决于块内引用的位置
- 引用变量何时合适,为什么?你能解释一下实际的语法和位置吗?
- 当通过引用传递时,通过传递链表在第n个位置添加元素不起作用
- 传递对STL向量中偏移位置的引用
- 为什么在按值传递指针之后再按引用传递指针会指向原始内存位置
- 对数组中特定位置的调试器友好零成本命名引用
- 查找shared_ptr引用计数递增的位置
- 如何使用变量名称引用数组位置
- 如何通过引用传递指针来更改指针指向的位置
- 在多个位置引用的对象
- 堆栈/堆变量的变量/引用名称或类型存储在内存中的位置
- 在模板上下文中通过引用传递的参数的"const"限定符的位置
- 使用对std::向量的某些元素的引用,或这些元素在向量中的位置,对它们进行迭代
- 将菜单项位置引用到同一菜单中的另一个菜单项