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)
不需要指针或动态分配的向量.
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)
归档时间: |
|
查看次数: |
98758 次 |
最近记录: |