Я хочу обменять значения карты следующим образом, но это не работает - PullRequest
0 голосов
/ 10 апреля 2020

здесь я указатель, так что я тоже могу увеличивать и уменьшать, но он не работает, если я выполняю минус операции, как я упоминал в коде

for(auto i = soldier.begin();i!=soldier.end();i++){

        int temp1 = i->first;
        int temp2 = i->second;

        i->first = (i-temp2)->first;
        i->second = (i-temp2)->second;

        (i-temp2)->first = temp1;
        (i-temp2)->second = temp2;

    }

Ответы [ 2 ]

2 голосов
/ 10 апреля 2020

здесь я указатель, так что я тоже могу увеличивать и уменьшать, но он не работает, если я выполняю минус операции

i в вашем коде - итератор, а не указатель. Вы не можете уменьшить прямой итератор.

Следуя своей цели в соответствии с заголовком вопроса, вы можете поменять местами только значения, относящиеся к ключам на вашей карте soldier, создав итераторы для итерации по карте в поисках двух ключей, используя std::map::find(), а затем поменяйте местами с помощью std::swap():

std::map<DT1, DT2> soldier;

// insert elements (key,value)

// create iterators over the associative map container with your required data types for <key,value> :

const std::map<DT1, DT2>::iterator i1 = soldier.find(key1);
const std::map<DT1,DT2>::iterator i2 = soldier.find(key2);

// you can use auto as well:
//  auto i1 = soldier.find(key1);
//  auto i2 = soldier.find(key2); 

if ((i1 != soldier.end()) && (i2 != soldier.end()))
   { std::swap(i1->second, i2->second);
   }

Это позволит поменять значения соответствующих ключей между key1 и key2 на карте. Вы не упомянули типы данных (и они не показаны в коде), используемые для пар ключ-значение на карте, поэтому я предоставляю обобщенный ответ с типами данных DT1 и DT2.

Примечание. что:

  • Использование std::map::find ищет ключ (find(const key& key)) и не может использоваться со значениями.
  • Нельзя использовать итератор для замены двух ключей. Также бессмысленно менять местами как ключи, так и значения (как уже упоминалось в churill), поскольку это будет означать, что вы просто изменили порядок пар <key,value>.

Пример с картой из <int ,std::string> пар ключ-значение:

#include <iostream>
#include <iterator>
#include <map>
int main()
{
   std::map<int,std::string> soldier;
   soldier[1]="Soldier1";
   soldier[2]="Soldier2";

   const std::map<int ,std::string>::iterator i1 = soldier.find(1);
   const std::map<int ,std::string>::iterator i2 = soldier.find(2);

   if ((i1 != soldier.end()) && (i2 != soldier.end()))
   { std::swap(i1->second, i2->second);
   }

  std::map<int,std::string>::iterator it;
  for(it=soldier.begin(); it!=soldier.end(); ++it)
     std::cout<<it->first<<" "<<it->second<<"\n";

     // 1 Soldier2
     // 2 Soldier1

  return 0;
}
1 голос
/ 10 апреля 2020

Просто поменяйте местами элемент, вам нужен только оператор [], но вы должны быть уверены, что элемент есть:

map<int, int> m;
m.insert(std::pair<int, int>(1,100));
m.insert(std::pair<int, int>(2,1000));

// change
int temp = m[1];
m[1] = m[2];
m[2] = temp;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...