2016-11-22 25 views
3

我試圖通過我的向量循環,並獲取存儲在向量中的項目的地址。它適用於其他類型的迭代器(見下文),但是當我嘗試這樣做的for(auto it :my_vec)它拋出錯誤說error: no match for 'operator*' (operand type is 'my_class')如何獲取基於循環的範圍內的對象的地址?

#include <iostream> 
    #include <vector> 

    class my_class{ 
     int x; 
    public: 
     my_class(int x_):x(x_){} 

    }; 

std::vector<my_class> my_vec; 

void fill_vec(size_t size){ 

    for(int i = 0; i < size; i++){ 
     my_vec.push_back(my_class(i)); 
    } 

} 

int main(){ 

    size_t size = 10; 

    fill_vec(size); 

    for(auto it :my_vec){ 
     std::cout << &it << std::endl; 
     std::cout << &(*it) << std::endl; 
    } 

    std::cout << "-----------" << std::endl; 

    for(auto it = my_vec.begin(); it != my_vec.end(); it++){ 
     std::cout << &(*it) << std::endl; 
    } 

    std::cout << "-----------" << std::endl; 

    for(size_t i = 0; i < my_vec.size(); i++){ 
     std::cout << &my_vec[i] << std::endl; 
    } 

return 0; 
} 
+2

基於範圍的for循環獲取值,而不是迭代器。使用'auto&it:myVec'來獲取對'myVec'中對象的引用。 – zneak

+0

@zneak謝謝你..那麼做 – solti

+0

@zneak爲什麼你刪除你的回答說這個? – Barmar

回答

3

如何獲取基於循環範圍內的對象的地址?

以與獲取其他地方的對象地址相同的方式:使用addressof運算符(operator&)。

它適用於其他類型的迭代器(見下文),但是當我嘗試這樣做的for(auto it :my_vec)它拋出錯誤說基於for循環error: no match for 'operator*' (operand type is 'my_class')

範圍不給你一個迭代器。它給你一個對象。在這種情況下,您使用了auto,因此它會爲您提供my_class實例(因爲那恰好是容器的value_type),它是向量中對象副本的副本。 my_class沒有operator*(解引用運算符)的重載,因此您嘗試的行(包含*it)無效,編譯器會爲您描述問題。


所以,std::cout << &it << std::endl;是正確的,但它給你複製的地址,而不是在矢量對象。由於您可能需要向量中的對象地址,因此應該使用auto&my_class&來獲取引用。當你使用一個引用作爲操作符到addressof操作符時,你得到了被引用對象的地址。

3

範圍爲基礎的循環讓你值,而不是迭代器。使用auto& it : myVec可獲得對myVec中對象的引用。