簡體   English   中英

刪除 c++ 中 vector 的 const 限定符

[英]remove const qualifier of vector in c++

是否可以刪除向量的常量性? 如果可以,如何實現? 出於某種原因,我無法訪問main () ,我仍然可以刪除以下代碼片段中arr的常量嗎? 感覺就是auto arr0 = const_cast<vector<int> & > (arr); 等同於vector<int> arr0 = arr; . 我想這只是顯式與隱式轉換的一個例子,它們都創建了原始數組````arr```的副本。 是否可以在不創建副本的情況下就地刪除常量?

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;


vector<int> func(const vector<int>& arr){
//    vector<int> arr0 = arr;
    auto arr0 = const_cast<vector<int> & > (arr);
    sort(arr0.begin(), arr0.end());
    return arr0;
}

int main(){
    const vector<int> arr = {3,4,1,5,2};
    auto res = func(arr);
    for (auto n:res)
        cout<<n<<" ";
    return 0;

}

不要試圖拋棄 constness。 修改 const 對象將導致未定義的行為。

感覺就像auto arr0 = const_cast<vector<int> & > (arr);<\/code> 等同於vector<int> arr0 = arr<\/code> ;

它實際上是相同的。 演員陣容是多余的。

是否可以在不創建副本的情況下就地刪除 constness?

如果您希望在不復制的情況下對向量進行排序,那么首先不要將向量設為 const。 如果它是 const,那么你不能修改它。

您可以制作副本,它可以實現您已經嘗試做的事情。 (你也得到了返回值優化<\/a>)。

#include <vector>
#include <algorithm>

template <class T>
static std::vector<T> func(std::vector<T> v) {
  std::sort(v.begin(), v.end());
  return v;
}

你的例子很好。 並且無需復印。 沒有未定義的行為。 這就是為什么。 這將 arr 聲明為頂級常量。 沒有 UB 的 object 不可修改。 但是,const 的 object 不包括動態的 memory 內容。 事實上,內容甚至不允許聲明為 const。

const vector<int> arr = {3,4,1,5,2};

只要您不更改/寫入 const arr object,您就可以放棄常量。調用v.begin()v.end()不會更改arr object,因此不是未定義的行為。 在這里探索了這個

這不是 UB 並且對 arr 進行內聯排序。

void func(const vector<int>& arr){
    auto& arr0 = const_cast<vector<int> & > (arr);
    sort(arr0.begin(), arr0.end());
}

下面是 constexpr function 中的代碼示例:

#include <vector>
#include <algorithm>

consteval int foo()
{
    const std::vector<int> a = { 1,2,3 };
    auto& v = const_cast<std::vector<int>&>(a);
    v[0] = 42;
    std::sort(v.begin(), v.end());
    return a[2];
}

int main()
{
    return foo();  // returns 42 since sorted
}

編譯器資源管理器

暫無
暫無

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

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