C++ 如何实现可以传入向量和int*的函数?
我想写一个函数,它可以修改所有空间连续的容器的元素,比如向量,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) { /
#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_每个都是更好的候选者,如果你不打算把它们放在另一个容器中。