Хорошо, поэтому я знаю из названия, что мой вопрос звучит аналогично другим, и это так. Но моя проблема всегда немного отличается, и по какой-то причине я продолжаю получать ошибки, когда я ищу в Интернете и пытаюсь использовать другие народы. У меня есть карты (char, int), которые состоят из кучки символов и количества раз, когда они появляются в неизвестной строке. Моя программа подсчитывает и добавляет символы и целые числа к картам (char, int) просто отлично. У меня возникают проблемы с загрузкой этих значений в вектор (пара (char, int)) 1 на 1, поэтому я могу сортировать их по их сохраненному значению, а не по значению ключа. вот важная часть моего кода.
int test2=0;
//my map is charCount and my vector is charVector
for (map<char, int>::iterator char_it = charCount.begin(); char_it != charCount.end();
++char_it) {
charVector[test2].first = char_it->first;
charVector[test2].second = char_it->second;
test2++;
}
Я думаю, что цикл for даже не заканчивается, и я не знаю, почему. Я даже попробовал цикл for (без итератора), чтобы загрузить maps.first и maps.second значения 1 на 1. Ничто, кажется, не работает. Я не знаю, почему я не могу понять это, но я просто не могу
Проблема может заключаться в том, что vector
пуст, и operator[]
не предоставляет никаких проверок границ (однако функция-член at()
. Если бы вы использовали вместо at()
вместо этого, он бы std::out_of_range
хороший std::out_of_range
ошибка. Исходя из этого предположения, я предлагаю вам использовать push_back
для добавления элементов в вектор:
map<char, int> charCount = { { 'a', 1 }, { 'b', 2 }};
vector<pair<char, int>> charVector;
for (map<char, int>::iterator char_it = charCount.begin(); char_it != charCount.end();
++char_it) {
charVector.push_back(make_pair(char_it->first, char_it->second));
}
for (unsigned int i = 0; i < charVector.size(); i++)
std::cout << charVector[i].first << " " << charVector[i].second << "\n";
Если vector
не пуст и существует взаимно однозначное соответствие, то я предлагаю использовать at()
чтобы вы получили исключение, если вы выходите за пределы.
try {
for (map<char, int>::iterator char_it = charCount.begin(); char_it != charCount.end();
++char_it) {
charVector.at(test2).first = char_it->first;
charVector.at(test2).second = char_it->second;
test2++;
}
} catch(std::out_of_range& ex)
{
cout << "Out of range.\n";
}