将迭代器转换为指针?

Fra*_*ank 44 c++ pointers iterator stl vector

我有一个std::vectorn元素.现在我需要将指针传递n-1给具有函数最后元素的向量.

例如,我的vector<int> foo包含(5,2,6,87,251).一个函数需要vector<int>*,我想传递一个指针(2,6,87,251).

我可以(安全地)获取迭代器++foo.begin(),将其转换为指针并将其传递给函数吗?还是用&foo[1]

更新:人们建议我改变我的函数来获取迭代器而不是指针.在我的情况下,这似乎是不可能的,因为我提到的find功能是...的功能unordered_set<std::vector*>.那么在这种情况下,是将n-1元素复制foo到一个新的向量中并find使用指向该唯一选项的指针进行调用?非常低效!这就像画家Shlemiel,特别是因为我必须查询许多子集:最后一个n-1,然后n-2等等元素,看看它们是否在unordered_set.

Rob*_*ide 87

在这里,获取对迭代器使用的相应指针的引用:

例:

string my_str= "hello world";

string::iterator it(my_str.begin());

char* pointer_inside_buffer=&(*it); //<--
Run Code Online (Sandbox Code Playgroud)

[通知操作符*返回一个引用,因此对引用执行&将为您提供地址].

  • 当迭代器指向```my_str.end()```时会​​发生什么?指针是否指向字符串中的无效地址? (13认同)
  • @Unglued:如果您尝试引用`my_str.end()`,调试器版本将抛出一个断言`"string iterator not dereferencable"`并且发布版本将引发异常. (5认同)
  • 可以通过`&amp;my_str.front() + my_str.size()`获取结束指针的地址 (2认同)

bk1*_*k1e 8

在我的情况下这似乎是不可能的,因为我提到的功能是查找功能unordered_set<std::vector*>.

您使用自定义散列/谓词函数对象吗?如果没有,那么您必须将unordered_set<std::vector<int>*>::find()指针传递给您要查找的确切向量.指向具有相同内容的另一个向量的指针将不起作用.至少可以说,这对于查找不是很有用.

使用unordered_set<std::vector<int> >会更好,因为那样你就可以按值执行查找.我认为这也需要一个自定义哈希函数对象,因为据hash我所知不具备专业化vector<int>.

无论哪种方式,指向矢量中间的指针本身并不是矢量,正如其他人所解释的那样.您无法将迭代器转换为指向vector的指针而不复制其内容.


Uri*_*Uri 6

如果可以,更好的选择可能是更改函数以将迭代器作为元素或全新的向量(如果它不修改).

虽然你可以用数组做这类事情,因为你知道它们是如何存储的,但对于向量来说也是一个坏主意.&foo[1]没有这种类型vector<int>*.

此外,虽然STL实现可以在线获得,但尝试依赖抽象的内部结构通常存在风险.