Pergunta

Eu tenho um vetor de ponteiros que não são de propriedade do recipiente. Como faço para usar algoritmos sobre os alvos dos ponteiros. Tentei ptr_vector uso do impulso, mas tenta excluir os ponteiros quando ele sai do escopo.

Aqui está um código que precisa de trabalho:

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.

Eu percebo que para loops iria trabalhar, mas isso acontece em um monte de lugares, de modo algum tipo de adaptador unário? Eu não era capaz de encontrar um. Agradecemos antecipadamente!

Foi útil?

Solução

Você pode usar impulsionar Iterator Indirect . Quando desreferenciado (com operator*()), aplica-se um extra dereference, assim você acaba com o valor apontado pelo ponteiro referenciado pelo iterador. Para mais informações, você também pode ver esta pergunta sobre um dereference iterador .

Aqui está um exemplo simples:

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

Outras dicas

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));

Fill não pode tomar função assign (para que ele iria excluir a referência ponteiros). Portanto for_each () foi usado. Para otimização seria sábio para adicionar if (! Consistente) antes de executar for_each (). Funções usadas na acima STL forros:

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; }

Você pode olhar para boost::shared_ptr<> - um ponteiro inteligente com contagem de referência. Ele não vai apagar o ponteiro depois que ele sai do escopo.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top