как использовать алгоритмы STL с вектором указателей - PullRequest
12 голосов
/ 07 мая 2009

У меня есть вектор указателей, которые не принадлежат контейнеру. Как мне использовать алгоритмы на мишенях указателей. Я попытался использовать ptr_vector для boost, но он пытается удалить указатели, когда выходит из области видимости.

Вот код, который должен работать:

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.

Я понимаю, что для циклов будет работать, но это происходит в нескольких местах, так что какой-то унарный адаптер? Я не смог найти один. Заранее спасибо!

Ответы [ 3 ]

19 голосов
/ 07 мая 2009

Вы можете использовать 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
3 голосов
/ 07 мая 2009
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 (! Compatibility) перед запуском for_each (). Функции, используемые в вышеупомянутых вкладышах STL one:

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; }
0 голосов
/ 07 мая 2009

Можно посмотреть на boost::shared_ptr<> - умный указатель с подсчетом ссылок. Он не удалит указатель после выхода из области видимости.

...