Я разрабатываю одну программу, в которой я принимаю ключи и значения из самой системы для stl-карты.
Я хочу выполнить следующую задачу. мой ключ находится в диапазоне от 0 до 1000. Прежде чем вставлять значения в ключ, я должен проверить, есть ли на карте один и тот же ключ. если да, мне нужно увеличить ключ на 1 и назначить значения этому ключу. Я стараюсь следовать следующим образом. Но я не преуспеваю.
map<int, Values> items;
Values connection (inet_ntoa(Clientaddr.sin_addr),ntohs(Clientaddr.sin_port),inet_ntoa(Servaddr.sin_addr),ntohs(Servaddr.sin_port));
for(unsigned int key=0;key<=1000;key++)
{
map<int,Values>::const_iterator itemsIterator=items.find(key);
if(itemsIterator==items.end())
{
items.insert(pair<int, Values> (key, connection));
}
else
{
cout<<"already exist";
key++;
}
}
Я вижу четыре недостатка в представленном фрагменте кода.
Прежде всего вы определили карту как имеющую key_type int
то время как в цикле вы используете тип ключа unsigned int
. Хотя это не ошибка, но делает код менее понятным. Таким образом, вы должны решить, будет ли key_type int
или unsigned int
В цикле лучше указать key_type
вместо явного указания некоторого целочисленного типа.
Поэтому я бы написал контрольный оператор цикла как
for ( std::map<int, Values>::key_type key = 0; key <= 1000; key++ )
Также вы увеличиваете ключ дважды в цикле, если он уже присутствует на карте.
for(unsigned int key=0;key<=1000;key++)
{
//...
else
{
cout<<"already exist";
key++;
}
}
Он увеличивается в самой команде управления и в составной инструкции else.
Третий недостаток состоит в том, что вы не вызываете функциональное соединение в инструкции
items.insert(pair<int, Values> (key, connection));
В этом выражении выражение connection
имеет тип указателя на функцию. Я думаю, что вы должны вызвать функцию, чтобы получить значение, вычисленное функцией.
И четвертый дефект - неправильный синтаксис оператора
Values connection (inet_ntoa(Clientaddr.sin_addr),ntohs(Clientaddr.sin_port),inet_ntoa(Servaddr.sin_addr),ntohs(Servaddr.sin_port));
Неясно, является ли это вызовом функции или объявлением функции.
Поэтому я бы переписал фрагмент кода как
std::map<int, Values> items;
for( std::map<int, Values>::key_type key = 0; key <= 1000; key++ )
{
std::map<int, Values>::const_iterator itemsIterator = items.find( key );
if( itemsIterator == items.end() )
{
items.insert( pair<int, Values>( key, connection( /*arguments of the function*/ ) ) );
}
else
{
cout << key << " already exists";
}
}
Прямо сейчас вы соединяете соединение со всеми неиспользуемыми ключами. Вы также делаете то, что я не совсем понимаю, где вы дважды увеличиваете key
если он существует на карте. Это должно исправить обе проблемы:
map<int, Values> items;
Values connection (inet_ntoa(Clientaddr.sin_addr),ntohs(Clientaddr.sin_port),inet_ntoa(Servaddr.sin_addr),ntohs(Servaddr.sin_port));
for(unsigned int key=0;key<=1000;key++)
{
map<int,Values>::const_iterator itemsIterator=items.find(key); //try to find the key in the map
if(itemsIterator==items.end()) //if the key doesn't currently exist in the map
{
items.insert(pair<int, Values> (key, connection)); //add it to the map with the connection
break; //and exit the loop
}
else //the key already exists, try the next one in the next pass of the for loop
{
cout<<"already exist";
}
}
break;
заявление после вставки. Вам также не нужна строкаkey++
посколькуkey
будет увеличиваться при следующем проходе циклаfor
.key + 1
также уже существует?