我如何实现一个可以传递向量和 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 * 的函数?的主要内容,如果未能解决你的问题,请参考以下文章