выгрузка 1-го и 2-го значений карты в 1-е и 2-е значения векторной пары

0

Хорошо, поэтому я знаю из названия, что мой вопрос звучит аналогично другим, и это так. Но моя проблема всегда немного отличается, и по какой-то причине я продолжаю получать ошибки, когда я ищу в Интернете и пытаюсь использовать другие народы. У меня есть карты (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. Ничто, кажется, не работает. Я не знаю, почему я не могу понять это, но я просто не могу

  • 1
    Был ли вектор инициализирован достаточным количеством элементов? Вы не упоминаете это.
Теги:
vector
maps

1 ответ

0
Лучший ответ

Проблема может заключаться в том, что 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";
}
  • 0
    Вау, это сработало прекрасно, большое спасибо!

Ещё вопросы

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