`i` to iterator.
`*i` to to na co wskazuje iterator, czyli `record*`.
A jak masz wskaźnik na record, to żeby dostać pole `pc`, potrzebujesz albo kolejne *, albo -> .
Więc
(*i)->pc
// lub
(**i).pc
Natomiast...
1. czemu w ogóle taka pętla po iteratorach zamiast normalnej pętli po kontenerze:
for(record *ptr : dictionary)
2. czemu przechowujesz <record*> zamiast po prostu <record>
3. czemu std::list, który prawie zawsze jest złym wyborem? Czemu nie vector lub - skoro nazwałeś "dictionary" to podręcznikowy typ słownikowy - (unordered_)map<string, int>?