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

我有一个全球范围内的myObjectsvector。 我有一个方法,使用std::vector<myObject>::const_iterator来遍历向量,并做一些比较来find一个特定的元素。 一旦我find了所需的元素,我想能够返回一个指针(vector存在于全局范围内)。

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

我是否需要将const_iterator回myObject,然后返回该地址?

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

 &(*iterator) 

编辑:清除一些困惑:

 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 } 

不需要指针或dynamic分配的向量。

返回&迭代器将返回迭代器的地址。 如果你想返回一个引用元素的方式,返回迭代器本身。

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

在这两种情况下,根据STL的实现情况,可能很难通过偶尔发生的随机错误进行debugging。

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

迭代器不是比其他variables更多或更less的本地或临时的,它们是可复制的。 你可以返回它,编译器会像指针一样为你创build副本。

现在与常规。 如果调用者想要通过返回的元素(无论是指针还是迭代器)执行修改,那么你应该使用非常量迭代器。 (只需从迭代器的定义中删除“const_”)。

返回迭代器不是一个好主意。 当对向量进行修改(反转\删除)时,迭代器变为无效。 此外,迭代器是在堆栈上创build的本地对象,因此返回相同的地址并不安全。 我build议你使用myObject而不是向量迭代器。

编辑:如果对象是轻量级的,那么它更好地返回对象本身。 Otheriwise返回指向存储在vector中的myObject的指针。

只要你的向量在全球范围内,你可以返回:

 &(*iterator) 

我会告诫你,这是相当危险的一般。 如果您的向量已经移出全局作用域并被破坏,则任何指向myObject的指针都将失效。 如果您将这些函数作为较大项目的一部分来编写,则返回一个非const指针可能会导致某人删除返回值。 这将对应用程序产生不确定的,灾难性的影响。

我会重写这个:

 myObject myFunction(const vector<myObject>& objects) { // find the object in question and return a copy return *iterator; } 

如果您需要修改返回的myObject,请将您的值存储为指针并将其分配到堆上:

 myObject* myFunction(const vector<myObject*>& objects) { return *iterator; } 

这样你可以控制什么时候被破坏。

像这样的东西会打破你的应用程序:

 g_vector<tmpClass> myVector; tmpClass t; ti = 30; myVector.push_back(t); // my function returns a pointer to a value in myVector std::auto_ptr<tmpClass> t2(myFunction()); 

你可以使用vector的数据function:

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

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

 //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; 

说,你有以下几点:

 std::vector<myObject>::const_iterator first = vObj.begin(); 

然后向量中的第一个对象是: *first 。 要获取地址,请使用: &(*first)

但是,为了与STLdevise保持一致,如果您打算稍后将其传递给STLalgorithm,则build议返回一个迭代器。

您正在向量中存储myObject的副本。 所以我相信复制myObject的实例不是一个昂贵的操作。 那么我认为最安全的是从你的函数返回一个myObject的副本。

参考dirkgently和anon的答案,你可以调用前面的函数而不是开始函数,所以你不必写* ,但只有&

代码示例:

 vector<myObject> vec; //You have a vector of your objects myObject first = vec.front(); //returns reference, not iterator, to the first object in the vector so you had only to write the data type in the generic of your vector, ie myObject, and not all the iterator stuff and the vector again and :: of course myObject* pointer_to_first_object = &first; //* between & and first is not there anymore, first is already the first object, not iterator to it. 

我不确定是否需要返回迭代器指向的地址。 所有你需要的是指针本身。 你会看到STL的迭代器类本身实现了_Ptr用于这个目的。 所以,只要:

 return iterator._Ptr;