我如何实现一个可以传递向量和 int * 的函数?

Posted

技术标签:

【中文标题】我如何实现一个可以传递向量和 int * 的函数?【英文标题】:how can i implement a function which can passin vector and int *? 【发布时间】:2020-09-22 01:48:07 【问题描述】:

我想编写一个函数,它可以修改所有空间连续的容器的元素,例如向量、int*。字符* ....

这是我的代码:

#include <vector>
#include <string>
#include <iostream>

using namespace std;

template <typename T>
void test(T* t, size_t size) 
  for (size_t i = 0; i < size; ++i) 
    // *(t + i * sizeof(size_t)) += 2;
    *(t + i * sizeof(size_t)) = *(t + i * sizeof(size_t)) + 2;
    // cout << *reinterpret_cast<int*>(t + sizeof(size_t) * i) << endl;
                                                                                                                                                                                                          


int main() 
  std::vector<size_t> a = 1,2,3,4;
  test(&a[0], 4);  // print result is: 3, 2,3,4, which only modify the first element
  int b[4] = 1,2,3,4;
  test(b, 4); // print result is: 3, 2,3,4, which only modify the first element
  for (size_t i = 0; i < a.size(); ++i) 
    cout << a[i] << " ";
  
  for (size_t i = 0; i < 4; ++i) 
    cout << b[i] << " ";
  

请看代码中的注释,我想当我使用*(t + i * sizeof(size_t))时,它会找到下一个int位置,但它失败了,有人能帮忙吗?

【问题讨论】:

"我想写一个函数,它可以为所有空间连续的容器修改元素,比如,vector,int*.char*" 然后做标准库做的事情,并接受一对迭代器(指针是一种迭代器)。 【参考方案1】:

如果您想将2 添加到集合的每个元素,C++ 已经提供了一种方法:

std::vector<size_t> a = 1,2,3,4;
std::transform(a.begin(), a.end(), a.begin(), [](int i) return i + 2; );

与您的代码相比,这有一些明显的优势:

    它适用于非连续集合(以及连续集合) 它将迭代与每个项目执行的操作分开 它已经过调试和大量测试

【讨论】:

@xyhuang 如果您不打算将它们放在另一个容器中,我认为std::for_each 是更好的选择。【参考方案2】:

在这个表达式中不需要将偏移量乘以sizeof(size_t)

*(t + i * sizeof(size_t))

由于已知指针的类型为T,将i 添加到指针将指向下一个对象。所以你可以这样做:

*(t + i)

当然,通常的写法是:

t[i]

另外,这个调用是不正确的:

std::vector<size_t> a = 1,2,3,4;
test(&a[0], 4);

如果您想像现在这样将vector 视为一个数组,则需要像这样使用data 方法:

test(a.data(), 4);

这是demo。

【讨论】:

非常感谢,我认为这是一个简单的问题,忘记简单的方法。非常感谢 @xyhuang 查看更新。您使用矢量的调用是错误的。 还有一个问题,当我调用 *(t + i * sizeof(size_t)) 时,我认为它会访问未知的内存地址,为什么它没有崩溃(如段错误) @xyhuang 参考this 找出不崩溃的原因。

以上是关于我如何实现一个可以传递向量和 int * 的函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何将向量传递给函数参数(我需要指针吗?)

如何将向量中的值传递给带有多个参数的函数

将向量作为对递归函数的引用传递

C++:使用 int 指针指向在函数内部创建的向量

将向量作为函数参数传递

在函数中传递向量