Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 我是否可以合法地写入常量向量指向的数据,例如对其进行排序?_C++_Sorting_Vector_Constants - Fatal编程技术网

C++ 我是否可以合法地写入常量向量指向的数据,例如对其进行排序?

C++ 我是否可以合法地写入常量向量指向的数据,例如对其进行排序?,c++,sorting,vector,constants,C++,Sorting,Vector,Constants,我有一个常量整数向量常量向量v={5,1,3,2,4}。如何在不使用任何额外内存(如向量、数组等)的情况下对其进行排序。我已经使用c++11进行了测试。在我的工作中,它对我来说很好 可以使用指针对C++中的任何常数容器排序。 在您的情况下,如果要使用sort(v.begin(),v.end())对该向量进行排序,则会由于违反const而导致一些运行时错误 但您可以按以下方式对容器进行排序- vector<int>*temp=(vector<int>*)&v; so

我有一个常量整数向量
常量向量v={5,1,3,2,4}
。如何在不使用任何额外内存(如向量、数组等)的情况下对其进行排序。

我已经使用c++11进行了测试。在我的工作中,它对我来说很好

可以使用指针对C++中的任何常数容器排序。

在您的情况下,如果要使用
sort(v.begin(),v.end())
对该向量进行排序,则会由于违反
const
而导致一些运行时错误

但您可以按以下方式对容器进行排序-

vector<int>*temp=(vector<int>*)&v;
sort(temp->begin(),temp->end());
vector*temp=(vector*)&v;
排序(临时->开始(),临时->结束());
在此之后,常数向量v将如下所示-

const vector<int> v = {1,2,3,4,5}
常量向量v={1,2,3,4,5} 你不能

你的向量是不可变的。这是无法改变的。没有[法律]方法来重新排列它的内容


从广义上讲,如果您想要其内容的排序版本,您将需要一个新的向量,它需要更多的内存。

正如您在回答中所示,解决方案是从向量中去掉常量,即:

vector<int>&temp = const_cast<vector<int>&>(v);
sort(temp.begin(), temp.end());
vector&temp=const_cast(v);
排序(临时开始(),临时结束());
这是因为您没有更改向量的状态。关于未定义的行为和丢弃const,standard所说的唯一一件事是

在常量对象()的生存期()内修改(,)该对象()的任何尝试都会导致未定义的行为。[……]

[expr.ass]、[expr.post.incr]和[expr.pre.incr]中的任何内容都不适用于此示例,因此不认为您正在修改对象



但我确实觉得这是一个缺陷。元素的顺序对比较运算符很重要,所以这种修改应该适用。

有一点让我感到困惑:有没有可能实现一个人为的但一致的
std::vector
,它使用
const int*
作为
数据
,并且只在修改元素或向量后返回到
int*
它本身如果是这样的话…希望你能达到我的目标。或者我只是缺少了将
int*
指定为数据的功能?@FrançoisAndrieux这就是为什么在修改它时需要回退到
int*
。向量不知道它是否为常量,但它知道它何时为常量modified@formerlyknownas_463035818
cv qualifier std::vector
的数据类型是
T*
向量的cv限定不会影响其中元素的类型。@NathaonOliver如果它是非常量,它仍然可以假装具有
T*
作为值类型,当它实际存储
const T*
时,一旦修改,它可以切换回存储
T*
。从外面你不会注意到除了这个黑客是ub,除非我错过了something@PeterA.Schneiderconst是否合格,因此
v.data()
yeilds
const T*
所以您仍然需要强制转换。但我使用这两行代码
vector*temp=(vector*)&v
排序(临时->开始(),临时->结束())
。那你能解释一下这是怎么可能的吗?我已经用c++11完成了。提前感谢。@TanmoyDatta要么NathanOliver的答案是正确的,要么这个答案是正确的,并且您有未定义的行为(UB可以做任何事情,从看似正确的工作开始,直到将应用程序崩溃到)。即使它是有效的,我也建议将它视为无效的,以避免像这里发生的讨论,当有人会看到你的代码时。@Yksisarvinen(基本上我是在作弊,但在这个话题上我有点同意)@TanmoyDatta什么是可能的,什么看起来有效,什么是合法的/有效的,总是有效的,这是两件不同的事情。“它对我有用”在C++中是不够的证明。不过,请看我上面的评论,因为我在这里有点作弊。(如果这会引起更多的混乱,我可能会删除,但让我们看看它是怎么回事)我在interviewbit网站上解决了一个面试问题。为了解决这个问题,我需要一些方法。然后我使用这个想法,成功地解决了这个问题,所以我在这里分享这个想法。因此,现在我可以删除我的答案或这个问题吗?评论不是为了进一步讨论;此对话已结束。如果重要,请将信息编辑到问题或答案中。根据编译器和操作系统,
const std::vector v={5,1,3,2,4}可能会在配置为只读的内存段中结束,在这种情况下,它不能修改。@rcgldr这是真的,但指向的数据在语法上不是向量的一部分,并且具有其声明中给定的类型,在本例中为
int
(不是
const int
)。类型为
int
的对象通常是可写的;-)@Schneider——这个例子使用了一个文本,它通常是一个常量元素数组。在Visual Studio 2015中,查看生成的程序集,数据数组最终位于const段中