[英]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.