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