C++ 从C+中的向量获取指针向量+;
有没有一种简单的方法可以创建指向向量元素的指针向量 i、 e.比下面的更容易C++ 从C+中的向量获取指针向量+;,c++,stl,vector,C++,Stl,Vector,有没有一种简单的方法可以创建指向向量元素的指针向量 i、 e.比下面的更容易 std::vector<T*> fn(std::vector<T> &v) { std::vector<T*> r; for (int i = 0; i < v.size(); i++) { r.push_back(&v[i]); } return r; } std::vector fn(std::vector&v) { std
std::vector<T*> fn(std::vector<T> &v)
{
std::vector<T*> r;
for (int i = 0; i < v.size(); i++)
{
r.push_back(&v[i]);
}
return r;
}
std::vector fn(std::vector&v)
{
std::向量r;
对于(int i=0;i
编辑:通过引用输入向量我看不出您需要这样做的原因。如果你增长
v
你的指针可能会失效;和r[i]
只是&v[i]
的别名
如果您真的需要传递指针(我们仍然不理解为什么),您可以传递
&v[0]
和向量的大小。鉴于std::vector
的所有实现都必须保证向量中的元素连续存储在内存中,您可以从第一个元素的地址和向量的大小推断出所有地址。没有标准的库函数可以做到这一点
std::vector<T*> pv(v.size());
for (size_t i=0; i<v.size(); ++i)
pv[i] = &v[i];
std::vectorpv(v.size());
对于(size_t i=0;i您可以按照以下方式进行操作:
template <typename T>
T* mk_ptr(T& t) {
return &t;
}
template <typename T>
std::vector<T*> fn(std::vector<T>& v) {
std::vector<T*> r;
std::transform(v.begin(), v.end(), std::back_inserter(r), mk_ptr);
return r;
}
模板
T*mk_ptr(T&T){
返回&t;
}
模板
标准::向量fn(标准::向量&v){
std::向量r;
std::transform(v.begin()、v.end()、std::back\u inserter(r)、mk\u ptr);
返回r;
}
但人们不得不怀疑这一点的动机……迭代器的存在是有原因的。没有人保证指针将保持有效。正如@Benoit所建议的,存储这些指针是一个坏主意。但是如果你真的想这样做,你可以像这样使用std::transform
:
template<class T>
struct Address
{
T* operator()(T& t) const
{
return &t;
}
};
template<class T>
vector<T*> fn(vector<T>& v)
{
vector<T*> r;
transform(v.begin(), v.end(), back_inserter(r), Address<T>());
return r;
}
int main( void )
{
vector<int> a;
a.push_back(0);
fn(a);
}
模板
结构地址
{
T*运算符()(T&T)常量
{
返回&t;
}
};
模板
向量fn(向量和向量)
{
向量r;
转换(v.begin(),v.end(),back_inserter(r),Address());
返回r;
}
内部主(空)
{
载体a;
a、 推回(0);
fn(a);
}
首先,您必须找到正确的方法。您的代码(编辑:原始代码,其中v
通过值传递,即)错误,并导致未定义的行为。根据应用程序的不同,您通常需要一个或一个正常的容器来存储。为什么?在任何情况下,您现在拥有的都是不好的:您得到了指向函数局部变量v
元素的指针;这些指针在返回时就会悬空。您应该使参数r引用。给出的示例将生成指向函数退出后不存在的对象的指针向量。我假设您希望原型为std::vector fn(std::vector&v)
即,传递源向量的引用,而不是副本,该引用将被销毁。该代码会创建悬空指针,并且在大多数系统上很容易崩溃或出现意外行为,因为v
及其所有元素在fn
离开后会被释放。很抱歉,是的,错过了一个符号,然后我只是重新迭代:?是的,但在我的(愚蠢)如果向量大小调整一次,我需要随后传递vectors@xtofl:为什么不呢?你真的认为这样做会有代价吗?@xtofl:我不太关心执行如此反常操作的程序中的微优化。(但仅供参考:我的编译器会对此进行优化。)@GMan:size
的复杂度必须是@xtofl:顺便说一句,在C++0x中,所有容器的复杂度都必须是O(1)。感谢所有指出这是一件愚蠢的事情的人,毫无疑问,这是一个非常有用的知识。