C++ 从C+中的向量获取指针向量+;

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

有没有一种简单的方法可以创建指向向量元素的指针向量

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::向量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)。感谢所有指出这是一件愚蠢的事情的人,毫无疑问,这是一个非常有用的知识。