2017-01-16 2 views
1

Я создаю карту для сравнения и вижу, уникальны ли все буквы слова или нет. Когда я создаю эту карту, я сохраняю значение 1 для соответствующего символа. Проблема в том, что когда я печатаю значения карты из символов, я получаю нули только для всех значений.Как изменить значение целого целого по умолчанию на карте?

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

Ниже приведен код, который я в настоящее время, как вы видите, я пытаюсь передать в 1 для героев слова и мои чеки кода, чтобы увидеть, если символ уже существует на карте:

#include <iostream> 
    #include <map> 
    using namespace std; 
    bool unique(char const* word) 
     { 
     map<char,int> cmpr; 

     for(int i =0; word[i]!='\0';i++) 
     { 
     if(cmpr[word[i]]) 
     { 
      cout<<"Not all unique"; 
      return false; 
     } 
    else 
     { 
      cmpr.insert(pair<char,int>(word[i],1)); 
     } 
      cout<<cmpr[char(word[i])]; 
    } 
    for(map<char,int>::iterator it = cmpr.begin(); it != cmpr.end();it++) 
    { 

     cout<<it->first<<" and "<<it->second<<endl; 


    } 
    return true; 
} 
int main() 

{ 
    unique("hello"); 
} 

и мои выходные результаты в (при попытке печати первого и второго значения карте узлов):

e and 0 
    h and 0 
    l and 0 
    o and 0 
+1

Предпочитают использовать указатели массива 'std :: string', а не символы. Одной из распространенных проблем с массивами символов является сравнение указателей для упорядочения не целевой строки. –

+0

При поиске 'map', предпочитайте использовать' find', чем '[]'. 'Find' не будет вставлять новый ключ. –

ответ

2

проблема здесь состоит в том, что

if(cmpr[word[i]]) 

Вставляет элемент в карту, если он не существует, которого нет здесь. Это означает, что

cmpr.insert(pair<char,int>(word[i],1)); 

Есть ничего не делать операцию, так как ключ word[i] уже существует.

Что вы можете сделать, это изменить Condtion к

if(cmpr.find(word[i]) != cmpr.end()) 

так find не будет вставить элемент или изменить

cmpr.insert(pair<char,int>(word[i],1)); 

в

cmpr[word[i]] = 1; 

Чтобы заставить его работать


Обратите внимание, что все это действительно необходимо. Если вы используете std::sting и std::set то вся функция может быть записана в виде

bool unique(const std::string& word) 
{ 
    return std::set(word.begin(), word.end()).size() == word.size(); 
} 

Что это делает строит set из string и set имеет те же механики были это позволяет только уникальные ключи. Это означает, что если размеры не совпадают, то там был хотя бы один повторный символ.

+0

Или исправить условие, чтобы проверить, существует ли элемент без вставки его (функция 'map :: find()' member) –

+0

@BenVoigt Хорошая точка. Обновлено. – NathanOliver

+0

@BenVoigt Wow. Не могу поверить, что я это забыл. Еще раз спасибо. – NathanOliver

0

Вы можете использовать значение по умолчанию с приращением:

if (cmpr[word[i]]++ != 0) 
    // value was already present 

Это дополнительный бонус (в зависимости от того, как вы смотрите на это), что вы можете получить количество вхождений каждого символа после данных имеет был добавлен.

Смежные вопросы