簡體   English   中英

如何使用const_reference類型聲明一個變量並賦值給它,front()函數的返回值

[英]How to use const_reference type to declare a variable and assign to it, the return value of front() function

我聲明了一個向量並用三個值初始化它,

vector<int> vec{1, 2, 3};

我試圖將 vec.front() 的返回值分配給一個引用變量a

如何聲明使用正確的數據類型?

我試過,

vector<int>::const_reference &a = vec.front();           

但這句話是什么意思?

我可以先使用正確的數據類型聲明變量 a 然后使用

a = vec.front();

將 vec.front() 的返回值賦給變量a 如果是,那我應該寫什么?

我可以先使用正確的數據類型聲明變量 a 然后使用

a = vec.front();

將 vec.front() 的返回值賦給變量a

a不是正常變量; 它是一個引用,聲明一個引用而不說明它所指的是什么是不合法的:

const int& a;  // Illegal

聲明引用后,對變量執行的所有操作實際上都是對其引用的值執行,因此您永遠無法更改引用引用的內容。

const int& a = b;
a = 10;  // Changed the value of b.

我試過了, vector<int>::const_reference &a = vec.front();

這似乎是一種過於冗長的說法:

const int& a = vec.front();

vec.front()返回對向量前元素的引用。 const int& a = vec.front()聲明變量a使其成為對向量前元素的引用。

這通過承諾只讀值來避免復制。

如果你說:

int a = vec.front();

a現在是數組第一個元素的副本,但您可以自由更改它。

在 int 的情況下,沒有性能優勢。 但是,如果您的向量是string s 的向量,則引用將避免復制字符串,如果您不打算修改內容,這可能比引用具有顯着的性能優勢。

std::string str = "hello world, this is a long string.";
const std::string& a = str;  // Reference, no copy
std::string b = str;  // Copy of str, takes extra effort

vector::front()返回對向量中第一個元素的引用。 因此,您可以聲明存儲在向量中的類型的引用,也可以使用向量類中定義的類型( vector<int>::referencevector<int>::const_reference )來聲明引用。

   vector <int> v1;

   v1.push_back(10);
   v1.push_back(11);

   vector<int>::reference var1 = v1.front( ); // Returns a reference to the first element you can modify or
   int& x = v1.front(); // returns a reference to the first element you can modify

    .....

    vector<int>::const_reference var2 = v1.front(); // Returns a reference to the first element you can't modify
    const int& y = v1.front(); // Return a reference to the first element you can't modify

我可以先使用正確的數據類型聲明變量 a 然后使用

不可以。由於您要聲明引用,因此必須在聲明期間對其進行初始化。

還有一件事:

    vector<int>::const_reference &a=v1.front(); // This will not compile, because you are trying to take a reference of a reference

除了@kfsone 的好答案之外,還有一個(讓我說)技巧可以做類似於您所要求的事情。
我會做所有事情,但我在下面向您展示的內容。
無論如何,為了完整起見,如果您有一個reference_wrapper ,您實際上可以將它重新綁定到與您用來創建它的引用不同的引用。
這意味着您可以按照您的要求創建一個類似 object 的引用供稍后使用

這是一個最小的工作示例:

#include<functional>
#include<vector>
#include<cassert>

int main() {
    int x;
    std::reference_wrapper<int> w{x};
    std::vector<int> vec{1, 2, 3};
    w = vec[0];
    w.get() = 42;
    assert(vec[0] == 42);
}

再次,這是為了好奇。
我不建議你在你的代碼中這樣做(當然,除非你討厭你的同事)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM