В этом коде есть как минимум 4 проблемы, не в последнюю очередь из-за того, что использование векторов для этого вида поиска / подсчета крайне неэффективно.
1) std :: vector :: end () возвращает специальный тип итератора, который не поддерживает булевы операторы, такие как <= (но поддерживает оператор- или operator- =). Ну, он поддерживает их, но поведение не определено. </p>
Итак
for ( it = nameStorage.begin(); it <= nameStorage.end(); it++ )
должно быть
for ( it = nameStorage.begin(); it != nameStorage.end(); it++ )
2) Теперь, когда ваше утверждение for верно, это сравнение никогда не вернет true
else if ( it == nameStorage.end() ) {
и поэтому ваше новое значение никогда не будет сохранено в векторе. Чтобы найти tempInput в nameStorage, вы можете использовать std :: find
if (std::find(nameStorage.begin(), nameStorage.end(), tempInput) != nameStorage.end())
{
/// temp struct blah blah blah
nameStorage.push_back(tempStruct);
}
3) Использование оператора булевой эквивалентности в строках обычно считается плохой формой, т.е.
if ( tempInput == it->inputName ) {
должно быть
if (!tempInput.compare(it->InputName))
но вам не нужно этого делать, если вы используете std :: find (выше).
4) std :: getline поддерживает разделители, и вы должны использовать его вместо чтения по 1 символу за раз, см. http://www.cplusplus.com/reference/string/getline/
Наконец, вы действительно должны искать / подсчитывать карту. стандарт: карта в порядке
std::map<std::string, int> nameStorage;
if (nameStorage.find(tempInput) != nameStorage.end())
{
nameStorage[tempInput]++;
} else
{
nameStorage[tempInput] =1;
}