首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含对象的向量的const_cast

包含对象的向量的const_cast
EN

Stack Overflow用户
提问于 2009-01-06 02:19:39
回答 4查看 1.5K关注 0票数 1

我知道删除对象的常量的const_cast是不好的,

我有以下用例:

代码语言:javascript
复制
//note I cannot remove constness in the foo function
foo(const std::vector<Object> & objectVec) {

   ...
   int size = (int) objectVec.size();
   std::vector<Object> tempObjectVec;
   //Indexing here is to just show a part of the vector being
   //modified
   for (int i=0; i < (int) size-5; ++i) {
       Object &a = const_cast<Object&> objectVec[i];
       tempObjectVec.push_back(a);
   } 
   foo1(tempObjectVec);
}  

如果我在foo1中更改tempObjectVec对象,ObjectVec中的原始对象是否会更改,我会说是,因为我正在传递引用,这进一步提高了效率。你能建议一下替代方案吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-01-06 02:28:45

好吧,这取决于对象。但是,当您将对象传递给push_back时,这些对象正在被复制。您可以通过向复制构造函数添加一些调试代码来检查这一点。因此,如果对象行为良好,并且保持不同的副本分离,那么foo1可以随心所欲地更改它获得的向量。

一种更有效的方法是让foo1接受开始和结束迭代器:

代码语言:javascript
复制
void foo1(std::vector<Object>::const_iterator start,
          std::vector<Object>::const_iterator end);

...
foo1(objectVec.begin(), objectVec.end() - 5);

如果您不使用const_cast,那么类型系统将确保foo1不会更改任何元素,因为这些元素是const_iterators。

票数 3
EN

Stack Overflow用户

发布于 2009-01-06 02:29:21

您的tempObjectVec不能是引用的向量,所以我假定它应该声明为如下形式:

代码语言:javascript
复制
std::vector<Object> tempObjectVec;

在执行tempObjectVec.push_back(a)时,将创建对象的副本以将其推送到tempObjectVec向量中。由于这是一个副本,您甚至不需要使用const_cast来删除常量,我不清楚您为什么需要这样做。

票数 1
EN

Stack Overflow用户

发布于 2009-01-06 02:38:47

我相信这就是你想要的陈述:

const_cast<std::vector<Object>&> (objectVec)这将返回一个非常量std::vector的引用,这应该是foo1喜欢的(我假设是这样的)。

修改您的原始示例:

代码语言:javascript
复制
foo(const std::vector<Object> & objectVec) {

    ...
    foo1(const_cast<std::vector<Object> &>(objectVec));
}

但是,我建议查看需要使用非常数向量的foo1的实际需求,因为您似乎表示所有感兴趣的都是修改Object实例本身。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/415199

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档