当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《在c++中返回指向vector元素的指针》经验,为你挑选了2个好方法。

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

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

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



1> 小智..:

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

&(*iterator)

编辑:澄清一些困惑:

vector  vec;          // a global vector of ints

void f() {
   vec.push_back( 1 );    // add to the global vector
   vector ::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
}

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


我认为将指针返回到存储在向量中的对象并不是一个好主意.如果向量某人在获取指针后执行了push_back(),会发生什么.向量可能会调整大小并且指针可能变为无效,不是吗?
寻找完全相同的问题的答案,我遇到了这个线程,并认为任何有相同问题的人都应该知道:向量的重新分配_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容器可以是替代方案.
复制可能很昂贵(虽然在这种情况下不是假设)如果你想修改向量中的对象怎么办?
是的,这就是为什么我认为最安全的方法是返回副本.

2> David Rodríg..:

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

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

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

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

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

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

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有