C ++ std :: sort по вектору- Назначение места только для чтения - PullRequest
1 голос
/ 08 июня 2011

ОБНОВЛЕННОЕ РЕШЕНИЕ:

При моей конкретной проблеме вызов сортировки находился внутри функции Render, помеченной как const.Удаляя const (не мои предпочтения) или помещая сортировку в другую функцию (в нашем случае это нижняя часть моего Обновления), проблема решается.Как предложили несколько респондентов, это была постоянная проблема, но не там, где я искал!


ОРИГИНАЛЬНАЯ ПРОБЛЕМА

У меня есть список std :: vectorуказатели на объекты, объявленные таким образом:

std::vector<Object*> myObjects;

Я пытаюсь отсортировать их по элементам данных через геттер ... У меня также есть предикат сортировки.Вот предикат сортировки, за которым следует вызов std :: sort:

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

Вызов сортировки:

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

Я получаю дюжину или около того ошибок, хотя и жалуюсь на назначение read-только местоположение или подобное:

/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 Ответ

2 голосов
/ 08 июня 2011

Только из вашего кода, я предполагаю, что ваш Object::GetDist() метод не const.В C ++ объект const из class может вызывать только const членов.Если это так, то у вас есть 2 способа устранить эту ошибку.

(1) Сделать GetDist как const:

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

(2) Изменить SortByDistance:

bool SortByDistance (Object*, Object*); // <-- remove const
...