C++ 如何实现可以传入向量和int*的函数?

C++ 如何实现可以传入向量和int*的函数?,c++,vector,C++,Vector,我想写一个函数,它可以修改所有空间连续的容器的元素,比如向量,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) { /

我想写一个函数,它可以修改所有空间连续的容器的元素,比如向量,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*sizeofsize\u t时,它会找到下一个int位置,但它失败了,有人能帮忙吗?

在这个表达式中不需要将偏移量乘以sizeofsize\u 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);

这是一个。

在这个表达式中,不需要将偏移量乘以sizeofsize\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);

这是一个.< /p>< p>如果你想给集合的每个元素加2,C++已经提供了一个方法:

std::vector<size_t> a = {1,2,3,4};
std::transform(a.begin(), a.end(), a.begin(), [](int i){ return i + 2; });
与您的代码相比,这有几个明显的优势:

它既适用于连续集合,也适用于非连续集合 它将迭代与每个项目执行的操作分开 它已经过调试和大量测试 如果要对集合的每个元素添加2,C++已经提供了一种方式:

std::vector<size_t> a = {1,2,3,4};
std::transform(a.begin(), a.end(), a.begin(), [](int i){ return i + 2; });
与您的代码相比,这有几个明显的优势:

它既适用于连续集合,也适用于非连续集合 它将迭代与每个项目执行的操作分开 它已经过调试和大量测试
非常感谢,我认为这是一个简单的问题,忘了简单的方法吧。多谢各位much@xyhuang请参阅更新。您使用vector调用是错误的。还有一个问题,当我调用*t+i*sizeofsize\u t时,我认为它将访问未知的内存地址,为什么它不是crashedlike段fault@xyhuang参考以找出不崩溃的原因。非常感谢,我认为这是一个简单的问题,只是忘记了简单的方法。多谢各位much@xyhuang请参阅更新。您使用vector调用是错误的。还有一个问题,当我调用*t+i*sizeofsize\u t时,我认为它将访问未知的内存地址,为什么它不是crashedlike段fault@xyhuang请参阅以找出未崩溃的原因。我想编写一个函数,该函数可以修改空间连续的所有容器的元素,如vector,int*。char*然后像标准库那样,接受一对迭代器指针是一种迭代器,我想写一个函数,它可以修改所有容器的元素,这些容器的空间是连续的,比如向量,int*。char*然后像标准库那样,接受一对迭代器。指针是一种迭代器。@xyhuang我认为std::for_每个都是更好的候选者,如果你不打算把它们放在另一个容器中。@xyhuang我认为std::for_每个都是更好的候选者,如果你不打算把它们放在另一个容器中。