在c ++中返回指向vector元素的指针

Kra*_*kos 60 c++ containers pointers iterator

我在全局范围内有一个myObjects的向量.我有一个方法,它使用a std::vector<myObject>::const_iterator遍历向量,并进行一些比较以找到一个特定的元素.一旦找到了必需的元素,我希望能够返回指向它的指针(向量存在于全局范围内).

如果我返回&iterator,我是否返回迭代器的地址或迭代器指向的地址?

我需要将const_iterator背面强制转换为myObject,然后返回该地址吗?

小智 85

返回迭代器指向的东西的地址:

&(*iterator)
Run Code Online (Sandbox Code Playgroud)

编辑:澄清一些困惑:

vector <int> vec;          // a global vector of ints

void f() {
   vec.push_back( 1 );    // add to the global vector
   vector <int>::iterator it = vec.begin();
   * it = 2;              // change what was 1 to 2
   int * p = &(*it);      // get pointer to first element
   * p = 3;               // change what was 2 to 3
}
Run Code Online (Sandbox Code Playgroud)

不需要指针或动态分配的向量.

  • 我认为将指针返回到存储在向量中的对象并不是一个好主意.如果向量某人在获取指针后执行了push_back(),会发生什么.向量可能会调整大小并且指针可能变为无效,不是吗? (78认同)
  • 寻找完全相同的问题的答案,我遇到了这个线程,并认为任何有相同问题的人都应该知道:向量的重新分配_will_使所有引用,指针和迭代器无效.在向量的中间插入/删除,_will_使受影响的索引之后的所有指针,引用和迭代器无效.资料来源:http://www.sgi.com/tech/stl/Vector.html,http://stackoverflow.com/questions/3329956/do-stl-iterators-guarantee-validity-after-collection-was-changed.在这种情况下,List容器可以是替代方案. (12认同)
  • 复制可能很昂贵(虽然在这种情况下不是假设)如果你想修改向量中的对象怎么办? (7认同)
  • 迭代器也是如此。 (3认同)
  • 是的,这就是为什么我认为最安全的方法是返回副本. (3认同)

Dav*_*eas 13

返回&迭代器将返回迭代器的地址.如果要返回引用元素的方式,则返回迭代器本身.

请注意,为了返回迭代器/指针,您不需要向量是全局的,但向量中的操作可以使迭代器无效.例如,如果new size()大于保留的内存,则向向量添加元素可以将向量元素移动到不同的位置.从向量中删除给定项之前的元素将使迭代器引用不同的元素.

在这两种情况下,根据STL实现,可能很难通过每次经常发生的随机错误进行调试.

评论后编辑:'是的,我不想返回迭代器a)因为它的const,而b)肯定它只是一个本地的临时迭代器? - Krakkos'

迭代器不比任何其他变量更多或更少本地或临时,并且它们是可复制的.您可以返回它,编译器将使用指针为您创建副本.

现在有了常数.如果调用者想要通过返回的元素(无论是指针还是迭代器)执行修改,那么您应该使用非const迭代器.(只需从迭代器的定义中删除'const_').


小智 5

您可以使用向量的数据函数:

返回指向向量中第一个元素的指针。

如果不想要指向第一个元素的指针,而是通过索引,那么您可以尝试,例如:

//the index to the element that you want to receive its pointer:
int i = n; //(n is whatever integer you want)

std::vector<myObject> vec;
myObject* ptr_to_first = vec.data();

//or

std::vector<myObject>* vec;
myObject* ptr_to_first = vec->data();

//then

myObject element = ptr_to_first[i]; //element at index i
myObject* ptr_to_element = &element;
Run Code Online (Sandbox Code Playgroud)