繁体   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