我在将std::list<MyType>::iterator
转换为MyType*
时遇到了一些问题。我有一个MyType
数组,当我遍历它时,我调用了一些void doSomething(const MyType* thing)
。最终我这样做:
std::list<MyType> types = ... something here ...;
for( std::list<MyType>::const_iterator it = types.begin(), end = types.end(); it != end; ++it ) {
doSomething(&*it);
}
我的问题是,我是否通过此操作创建MyType
的内存副本:
&*it
尝试简单地传递迭代器就像它是指针一样,或者将迭代器强制转换为指针引发的编译器错误。
答案 0 :(得分:7)
不,*
和&
的序列不会创建副本:
*
生成引用 &
应用于引用会生成原始地址这两个步骤都不需要复制MyType
的数据。
注意:如果存在重载运算符&
,则使用std::address_of(*it)
表达式会更安全。
答案 1 :(得分:2)
迭代器的一个要求是它是可以降级的 - 即支持*it
。见http://en.cppreference.com/w/cpp/concept/Iterator。是否指定了*it
返回引用或副本。
理论上,使用*it
时,实现可以返回副本。
实际上,大多数实现在使用*it
时都会返回引用。因此,在使用&*it
时,您很可能不会看到副本。
答案 2 :(得分:0)
只要迭代器有效,它就可以满足您的需求。不,它不会创建副本。
答案 3 :(得分:0)
根据代码的编写方式,您将创建指针的副本,但不应复制指针指向的内存。
分解,你获取迭代器对象(it
),查看迭代器(MyType
)引用的*it
对象,然后获取该对象的地址( &*it
)。然后将指针复制到函数中并根据需要使用。