C++ 如何从迭代器获取向量中对象的地址

chr*_*ise 0 c++

我有一个向量 vec 包含对象 Order (不是指向对象的指针)

现在我需要在容器中找到某个对象并对其进行操作

for ( auto it = vec.begin(); it !=  vec.end(); ++it ) {

    Order *p_o = it; // ERROR HERE
    if ( p_o->id_ == id ) { p_o->size_ -= reduce_amount; }

}


error: C2440: 'initializing': cannot convert from 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<Order>>>' to 'Order *'
Run Code Online (Sandbox Code Playgroud)

如何获取迭代器保存的对象的地址

我都尝试过

it.pointer
it.reference
Run Code Online (Sandbox Code Playgroud)

但这会产生

C:\CPP\Simulator\Venue\venue.cpp:88: error: C2274: 'function-style cast': illegal as right side of '.' operator
Run Code Online (Sandbox Code Playgroud)

GMa*_*ckG 5

迭代器模拟指针,但不一定是指针本身。因此,只需取消引用它,如果您确实需要指向该对象,请获取该对象的地址:

auto& my_ref_to_the_object = *iter;
auto* my_ptr_to_the_object = &my_ref_to_the_object;
Run Code Online (Sandbox Code Playgroud)

您的代码似乎根本不需要指向该对象的真正指针:

for (auto it = vec.begin(); it !=  vec.end(); ++it) {
    Order& p_o = *it;
    if (p_o.id_ == id) {
        p_o.size_ -= reduce_amount;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者更简单:

for (Order& p_o : vec) {
    if (p_o.id_ == id) {
        p_o.size_ -= reduce_amount;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • @chrise:它是一个“基于范围的 for 循环”,基本上是基于迭代器的 for 循环的语法糖。不用担心速度。如果比较干净的话是更好的选择。您的程序不需要尽可能快,只需足够快即可。因此,尽可能选择干净的代码,一旦程序太慢,您将对其进行分析以找出缓慢的地方。它不会像 for 循环那样,而是在其中的内容。 (2认同)