我有myObjects在全球范围的载体。 我有其使用std::vector<myObject>::const_iterator遍历向量的方法,并做一些比较,以找到一个特定的元件。 一旦我已经发现所需的元素,我想能够返回一个指向它(该矢量在全局范围存在)。

如果我回到&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
}

无需指针或动态分配的载体。

其他提示

返回&迭代器将返回的迭代器的地址。如果你想返回参照元素返回迭代器本身的一种方式。

要注意的是,你不需要载体是一个全球性的,以便返回迭代器/指针,但在向量操作可以无效迭代器。将元素添加到载体,例如,可以将向量元素移动到不同的位置,如果新的大小()比所保留的存储器大。从矢量给定项目之前的元素的删除将使迭代器指的是不同的元素。

在这两种情况下,根据不同的STL实现可能很难与每一个发生的只是随机误差经常调试。

注释后编辑:“是的,我不想回来,因为它的常量的迭代器),和b)当然这只是一种局部的,暂时的迭代器? - Krakkos'

迭代器是不或多或少本地或比任何其他变量临时并且它们能够复制。您可以返回它,编译器将让副本你,因为它会与指针。

现在与常量性。如果主叫方希望通过返回的元素进行修改(无论是指针或迭代器),那么你应该使用非const迭代器。 (只是删除从迭代器的定义中的“const_”)。

这是不返回迭代器是个好主意。迭代器变得无效时修改到载体(反转\缺失)发生的情况。此外,迭代器堆栈,从而返回相同的地址创建一个本地对象是不是在所有的安全。我建议你用myObject的工作,而不是矢量迭代器。

修改 如果对象是轻量级那么其更好地返回对象本身。 Otheriwise返回指针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;
    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;

说,则有以下:

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

然后,在载体中的第一个目的是:*first。要获取地址,使用:&(*first)

不过,在与STL的设计保持一致,我建议,而不是如果你打算以后围绕它传递给STL算法返回一个迭代。

您正在存储在载体中myObject的的副本。所以我相信复制myObject的实例是不是一个昂贵的操作。其次,我认为最安全的是来自你的函数返回myObject的副本。

参考dirkgently的和匿名的回答,您可以致电函数代替的开始功能,让你做的不可以必须写*,但只有&

代码示例:

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;
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top