Ключи и значения карты C ++ STL не работают должным образом

0

Я разрабатываю одну программу, в которой я принимаю ключи и значения из самой системы для 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++;
}
}
  • 0
    Намереваетесь ли вы назначить одно и то же соединение всем неиспользованным ключам? Если нет, вам нужно добавить break; заявление после вставки. Вам также не нужна строка key++ поскольку key будет увеличиваться при следующем проходе цикла for .
  • 0
    Что если key + 1 также уже существует?
Показать ещё 2 комментария
Теги:
networking
stl
client-server
map

2 ответа

0

Я вижу четыре недостатка в представленном фрагменте кода.

Прежде всего вы определили карту как имеющую 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";
   }
}
0

Прямо сейчас вы соединяете соединение со всеми неиспользуемыми ключами. Вы также делаете то, что я не совсем понимаю, где вы дважды увеличиваете 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";
  }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню