Как мне «соединить» элементы массива с другими переменными?

#c

#c

Вопрос:

Итак, я получил этот проект, который дал мне мой учитель, и я довольно новичок, поэтому я столкнулся с небольшой проблемой. В принципе, мне нужно ввести несколько городов и их население, и мне нужно вывести их в порядке от того, в котором больше всего людей, к тому, в котором меньше всего людей. Я использовал структуры для хранения информации о каждом городе, и теперь я не знаю, как я могу своего рода «подключить» население к каждому городу, если вы понимаете, что я имею в виду. Спасибо!

Вот как это выглядит, и для людей, которые не поняли вопроса, я получил население города и отсортировал его от самого высокого к самому низкому, и теперь я хочу отобразить название города с его населением рядом с ним, но я не знаю, как я могу теперь сложить их вместе.

 struct city
{
    string name;
    int population;
}cityVar[10];

int main()
{
    // Input
    for (int i = 0; i < 5; i  )
    {
        cin >> cityVar[i].name;
        cin >> cityVar[i].population;
    }

    int i, j;
    int temp;
    for (i = 0; i < 5; i  )
    {
        for (j = i   1; j < 5; j  )
        {
            if (cityVar[i].population < cityVar[j].population)
            {
                temp = cityVar[i].population;
                cityVar[i].population = cityVar[j].population;
                cityVar[j].population = temp;
            }
        }
    }
    for (i = 0; i < 5; i  )
    {
        cout << cityVar[i].population << " ";
    }
}
  

Комментарии:

1. Stack overflow — это не домашняя работа. Пожалуйста, предоставьте код, который у вас уже есть, поскольку он более единообразен, чем текст на английском

2. Не уверен, что я понял ваш вопрос, но вы, возможно, ищете std::unordered_map или std::map .

3. Либо вы копаетесь в std::map , либо ищете std::sort .

4. Если вы не сохранили совокупность в определенной вами структуре, где вы ее сохранили? Если бы вы это сделали, решение, которое вы ищете, — отсортировать ваши города по населению, а не «соединять» их.

5. Небольшой совет: в следующий раз, когда вы зададите здесь вопрос, покажите нам свою попытку сделать это в форме компилируемого кода. Удачи!

Ответ №1:

Вы не соединяете две переменные. Вы группируете их вместе, когда они принадлежат к одной концепции.

В этом конкретном случае я предлагаю вам создать абстракцию для a city путем создания struct и проинструктировать его о том, как сравнивать себя с другими городами, основываясь исключительно (в данном случае) на численности населения.

Вы можете сделать это, реализовав operator<

 struct city{
    unsigned population

    bool operator<(const cityamp; c1){
         return this.population < c1.population;
     }
};
  

Затем вы можете добавить свой элемент в массив или, что еще лучше, в std::vector и отсортировать их с помощью std::sort .

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

Комментарии:

1. не совсем тот способ, которым рекомендуется инкапсуляция данных, но я постараюсь

2. @skratchi.at это самый простой и интуитивно понятный способ, который я могу придумать на данный момент.

3. @skratchi.at абсолютно без обид =)

Ответ №2:

Вы потеряли «соединение», потому что поменяли местами только населенные пункты, когда должны были поменять местами целые города:

 city temp = cityVar[i];
cityVar[i] = cityVar[j];
cityVar[j] = temp;
  

Или, как мы часто это пишем

 std::swap(cityVar[i], cityVar[j]);
  

Ответ №3:

Вам нужно поменять местами весь объект, есть много способов сделать это, но в зависимости от того, чему вас научили, вам нужно быть осторожным с тем, какой метод вы используете. Это ни в коем случае не исчерпывающий список, я показал только самое простое, что пришло мне в голову….

Самый простой метод (но требует еще двух строк) и зависит от структуры данных, поэтому используйте temp city вместо temp int.

 struct city temp;
:
:
:
   if (cityVar[i].population < cityVar[j].population)
   {
       temp.population = cityVar[i].population;
       temp.name = cityVar[i].name;

       cityVar[i].population = cityVar[j].population;   
       cityVar[i].name = cityVar[j].name;

       cityVar[j].population = temp.population;
       cityVar[j].name = temp.name;
   }
  

Другим методом было бы использовать список указателей для отсортированного списка

 int main()
{
  struct city *cityVarSorted[10];
  for (int i = 0; i < 5; i  ) // initialise list to point to current structs
  {
    cityVarSorted[i] = amp;cityVar[i];
  }
  :
  :
  struct city *temp;
  :
  if (cityVarSorted[i]->population < cityVarSorted[j]->population)
  {
     temp = cityVarSorted[i]; // we're swapping the pointer now and not the individual members
     cityVarSorted[i] = cityVarSorted[j];
     cityVarSorted[j] = temp;
  }
}
  

конечно, это если вас учили указателям. Вам нужно знать, как это работает, чтобы вы могли это объяснить