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

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

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

我是否需要将 const_iterator强制转换回 myObject,然后返回该对象的地址?

138162 次浏览

返回迭代器指向的事物的地址:

&(*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
}

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

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

编辑: 如果对象是轻量级的,那么最好返回对象本身。否则返回指向存储在向量中的 myObject 的指针。

比如说,你有以下几点:

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

然后向量中的第一个对象是: *first

然而,为了与 STL 设计保持一致,我建议返回一个迭代器,如果您计划稍后将它传递给 STL 算法的话。

返回 & iterator 将返回迭代器的地址。如果您想返回一种引用元素的方法,那么返回迭代器本身。

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

在这两种情况下,根据 STL 实现的不同,仅仅是随机错误频繁发生就很难进行调试。

编辑后注释: ‘是的,我不想返回迭代器 a)因为它的常量,b)它肯定只是一个局部的,临时的迭代器?Krakkos 的

迭代器与其他任何变量相比都不是局部的或临时的,而且它们是可复制的。您可以返回它,编译器将为您复制,因为它将与指针。

现在有了常量。如果调用方希望通过返回的元素(无论是指针还是迭代器)执行修改,那么应该使用非常数迭代器。(只需从迭代器的定义中删除‘ const _’)。

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

只要你的向量保持在全局范围内,你就可以返回:

&(*iterator)

我要提醒你,这通常是相当危险的。如果您的向量被移出全局作用域并被销毁,任何指向 myObject 的指针都将无效。如果将这些函数作为较大项目的一部分编写,则返回非常量指针可能会导致某人删除返回值。这将对应用程序产生未定义的、灾难性的影响。

我会改写成:

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;
t.i = 30;
myVector.push_back(t);


// my function returns a pointer to a value in myVector
std::auto_ptr<tmpClass> t2(myFunction());

你可以使用矢量的 资料函数:

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

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

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

参考 Dirkently’s 和 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, i.e. 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;