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