Как использовать алгоритмы STL с вектором указателей
У меня есть вектор указателей, которые не принадлежат контейнеру. Как использовать алгоритмы для целей указателей. Я попытался использовать boost ptr_vector, но он пытается удалить указатели, когда он выходит из области видимости.
Вот код, который должен работать:
vector<int*> myValues;
// ... myValues is populated
bool consistent = count(myValues.begin(), myValues.end(), myValues.front()) == myValues.size();
auto v = consistent ? myValues.front() : accumulate(myValues.begin(), myValues.end(), 0) / myValues.size();
fill(myValues.begin(), myValues.end(), v);
// etc.
Я понимаю, что для циклов будет работать, но это происходит в кучке мест, поэтому какой-то унарный адаптер? Я не смог его найти. Спасибо заранее!
Ответы
Ответ 1
Вы можете использовать Boost Indirect Iterator. При разыменовании (с operator*()
) он применяет дополнительное разыменование, поэтому вы получаете значение, указанное указателем, на которое ссылается итератор. Для получения дополнительной информации вы также можете увидеть этот вопрос об итераторе разыменования.
Вот простой пример:
std::vector<int*> vec;
vec.push_back(new int(1));
vec.push_back(new int(2));
std::copy(boost::make_indirect_iterator(vec.begin()),
boost::make_indirect_iterator(vec.end()),
std::ostream_iterator<int>(std::cout, " ")); // Prints 1 2
Ответ 2
bool consistent = count_if(myValues.begin(), myValues.end(),
bind2nd(ptr_fun(compare_ptr), *myValues.front())) == myValues.size();
int v = consistent ? *myValues.front() : accumulate(
myValues.begin(), myValues.end(), 0, sum_int_ptr) / myValues.size();
for_each(myValues.begin(), myValues.end(), bind1st(ptr_fun(assign_ptr),v));
Заполнение не может принимать функцию назначения (так, чтобы она была указателем разыменования). Поэтому использовался for_each(). Для оптимизации было бы целесообразно добавить if (! Compatible) перед запуском for_each(). Функции, используемые в вышеуказанных STL-интерфейсах:
int sum_int_ptr(int total, int * a) { return total + *a; }
void assign_ptr(int v, int *ptr) { *ptr = v; }
bool compare_ptr(int* a, int pattern) { return *a == pattern; }
Ответ 3
Вы можете посмотреть boost::shared_ptr<>
- умный указатель с подсчетом ссылок. Он не удаляет указатель после того, как он выходит из области видимости.