C ++ std :: sort on vector <object *> - 只读位置的分配</object *>

时间:2011-06-08 02:45:15

标签: c++ stdvector

更新的解决方案:

由于我的特殊问题,sort调用是在标记为const的Render函数内。通过删除const(不是我的偏好)或将排序放入另一个函数(在这种情况下,我的更新的底部),问题得到解决。正如几位回答者所建议的,这是一个常见问题,而不是我在寻找的地方!


原始问题

我有一个指向对象声明的指针的std :: vector列表:

std::vector<Object*> myObjects;

我正试图通过getter对成员数据进行排序......我也有一个排序谓词。这是std :: sort调用后面的排序谓词:

bool SortByDistance(const Object* o1, const Object* o2)
{
    return o1->GetDist() < o2->GetDist();
}

排序电话:

std::sort(myObjects.begin(), myObjects.end(), SortByDistance);

虽然抱怨指定了只读位置或类似位置,但我得到了十几个错误:

/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS5.0.sdk/usr/include/c++/4.2.1/bits/stl_algo.h:2385: error: assignment of read-only location

我确定这是愚蠢的我正在做的事......有人可以帮忙解决一些问题吗?我的C ++生锈了,只是重新回到它!任何建议都会非常感激。

更新

我仍然得到同样的错误,尽管尝试iammilind的建议完全删除const或确保const为100%(换句话说,我尝试将const添加到SortByDistance谓词的末尾,以及完全将它从这种情况中删除。

我认为其中一位评论者可能会建议我做一些愚蠢和危险的事情:将原始指针存储到STL容器中的对象。我从来没有做过任何不同的事情但是......在没有动态分配在堆上的容器中存储对象的原因是什么?我假设如果我不处理原始指针,我的排序问题的很多复杂性就会消失。

我正在创建像这样的对象:

std::vector<Object*> myObjects;
Object* tempObject = new Object;
myObjects.push_back(tempObject);

我当然会在程序结束时释放内存,但听起来这通常只是一个坏主意?

在一个更相关的说明中(对于我提出的问题),这里是抱怨的stl_algo.h中的代码:

  template<typename _RandomAccessIterator, typename _Compare>
void
__insertion_sort(_RandomAccessIterator __first,
         _RandomAccessIterator __last, _Compare __comp)
{
  if (__first == __last) return;

  for (_RandomAccessIterator __i = __first + 1; __i != __last; ++__i)
{
  typename iterator_traits<_RandomAccessIterator>::value_type
    __val = *__i;
  if (__comp(__val, *__first))
    {
      std::copy_backward(__first, __i, __i + 1);
      *__first = __val;  // this line is the one complaining about read-only assignment
    }
  else
    std::__unguarded_linear_insert(__i, __val, __comp);
}
}

尽管尝试了各种const / no-const解决方案,我仍然得到同样的错误。如果我注释掉正在运行排序的行:     std :: sort(myObjects.begin(),myObjects.end(),SortByDistance); 当然,错误会消失。

1 个答案:

答案 0 :(得分:2)

仅从您的代码中,我猜您的Object::GetDist()方法不是const。在C ++中,const的{​​{1}}对象只能调用class个成员。 如果是这种情况,那么您有两种方法可以删除此错误。

(1)将const设为GetDist

const

(2)更改class Object { int GetDist () const; // <-- add const };

SortByDistance