我到处都有这个API:
void func(const vector<int> &vint);
哪个设计很糟糕,但是我需要将int*
传递给它而不分配\ copy,因为我发现它是一个瓶颈。 (在多个线程上同时执行memcpy
不会更快复制)
我想写一个这样的课:
template<typename T>
struct fake_vector {
fake_vector(T *array, size_t array_length) {
internal_vector.set_begin(array);
internal_vector.set_end(array + array_length);
}
~fake_vector() { // let's reset our internal vector so it won't try to deallocate our memory
internal_vector.set_begin(nullptr);
internal_vector.set_end(nullptr);
}
vector<T> &get() {
return internal_vector;
}
vector<T> internal_vector;
};
然后像这样使用它:
fake_vector<int> my_fake_vector(vint,vint_length);
process(my_fake_vector.get());
但我不知道如何设置矢量的开始\结束。这个问题是开放式的,可以解决这个fake_vector
最后一个难题或一个新的不那么狡猾的解决方案。
答案 0 :(得分:2)
您可以继承vector<T>
,然后使用_M_impl._M_start
和_M_impl._M_finish
进行调整:
template<typename T>
struct fake_vector : vector<T> {
fake_vector(T *array, size_t array_length) {
vector<T>::_M_impl._M_start = array;
vector<T>::_M_impl._M_finish = array + array_length;
}
~fake_vector() { // let's reset our internal vector so it won't try to deallocate our memory
vector<T>::_M_impl._M_start = nullptr;
vector<T>::_M_impl._M_finish = nullptr;
}
vector<T> &get() {
return *(vector<T>*)this;
}
};
例如正常使用:
int x[3] = {1,2,3};
fake_vector<int> fake_x(x,3);
for (auto &p : fake_x)
printf("%p = %d\n", &p, p);
for (int i = 0; i < 3; i++)
printf("%p = %d\n", &x[i], x[i]);
哪个输出:
0x7ffeb42406e0 = 1
0x7ffeb42406e4 = 2
0x7ffeb42406e8 = 3
0x7ffeb42406e0 = 1
0x7ffeb42406e4 = 2
0x7ffeb42406e8 = 3
注意:如果您使用的是libc ++(例如,收到未声明_M_impl
的错误),请尝试将_M_impl._M_start
替换为__begin_
,将_M_impl._M_finish
替换为__end_
}}