c ++ Совместное использование списка между главной и внешней функцией

0

Я делаю симулятор популяции кролика для задачи, которую я делаю. У меня есть карта объектов класса. У меня также есть список, содержащий ключи для карты. Каждый раунд симулятора я хочу добавить в класс больше объектов и обновить свою карту и список. Для этого я написал отдельную функцию "создания", которая будет произвольно генерировать новые объекты класса и добавлять их к карте и добавлять ключи к списку.

Проблема заключается в том, что я вызываю функцию создания, затем перебираю по карте, используя список, в котором отображается карта или список пуст (не уверен, что). Если я итерацию по карте перед выходом из нее, она отображает только самые новые объекты. Если я переведу код для функции в основную функцию, она работает правильно (вызов дважды дает мне новые объекты, созданные на первой итерации кода, а также объекты, созданные второй итерацией).

Я предполагаю, что каждый раз, когда вызывается функция, создается новый список или карта и перезаписывает старый список или карту. Как я могу получить список и карту для перехода между основной функцией и функцией создания?

Вот мой код:

#include "stdafx.h"
#include <iostream>
#include "windows.h"
#include <string>
#include <sstream>
#include <array>
#include <time.h>
#include <conio.h>
#include <map>
#include <list>

class Bunny
{
public:
    char fname;
    int sex, age, color, status;
    Bunny(int, int, int, int);
    Bunny();
    int s() { return (sex); }
    int a() { return (age); }
    int c() { return(color);}
    int st() { return (status);}
    int aging(int age) { return (age + 1); }
};

Bunny::Bunny(int s, int a, int c, int st)
{
    sex = s;
    age = a;
    color = c;
    status = st;
}
Bunny::Bunny(){}

void creation(std::map<std::string, Bunny> bunnies, std::list<std::string>names, int births);

std::string firstname(int s, int num)
{
    std::string name;
    if (s == 0)
    {
        switch (num)
        {
        case (0) :
            name = "Tim";
            break;
        case (1) :
            name = "Tom";
            break;
        case (2) :
            name = "Mark";
            break;
        case (3) :
            name = "Bob";
            break;
        case (4) :
            name = "Rob";
            break;
        }
    }
    if (s == 1)
    {
        switch (num)
        {
        case (0) :
            name = "Suzy";
            break;
        case (1) :
            name = "Linda";
            break;
        case (2) :
            name = "Mary";
            break;
        case (3) :
            name = "Jan";
            break;
        case (4) :
            name = "Julie";
            break;
        }
    }
            return (name);
}

void main()
{

    int num = rand() % 5;
    int n, births = 10;
    std::list<std::string>names;
    std::map<std::string, Bunny> bunnies;
    srand(time(0));
    creation(bunnies, names, births);
    std::cout << "Number" << "\t" << "Name" << "\t" << "age" << "\t" << "Sex" << "\t" << "Color" << "\t" << "Vampire?"  "\n";
    n = 0;
    for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
    {
        n++;
        std::cout << n << "\t";
        std::cout << " " << *it;
        std::cout << "\t" << bunnies[*it].a() << "\t" << bunnies[*it].s() << "\t" << bunnies[*it].c() << "\t" << bunnies[*it].st() << "\n";
    }
    creation(bunnies, names, births);
    _getch();
}



/*void year()
{
    for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
    {
        bunnies[*it].aging(bunnies[*it].a())
    }
}*/

void creation(std::map<std::string, Bunny> bunnies,std::list<std::string> names,int births)
{
    int n;
    for (n = 0; n < births; n++)
    {
        int num = std::rand() % 5;
        char id = (std::rand() % 100) + 20;
        int s = std::rand() % 2;
        std::string f = firstname(s, num) + '_' + id;
        int a = 0;
        int c = std::rand() % 5;
        int st;
        if (rand() % 50 == 43) st = 1; else st = 0;
        bunnies[f] = Bunny(s, a, c, st);
        names.push_front(f);
        //std::cout << f << " " << bunnies[f].a() << " " << bunnies[f].c() << "\n";
    }
    std::cout << "Number" << "\t" << "Name" << "\t" << "age" << "\t" << "Sex" << "\t" << "Color" << "\t" << "Vampire?"  "\n";
    n = 0;
    for (std::list<std::string>::iterator it = names.begin(); it != names.end(); it++)
    {
        n++;
        std::cout << n << "\t";
        std::cout << *it;
        std::cout << "\t" << bunnies[*it].a() << "\t" << bunnies[*it].s() << "\t" << bunnies[*it].c() << "\t" << bunnies[*it].st() << "\n";
    }
}
  • 0
    Способ написания кода более ценен, чем какой-либо конкретный трюк: начинайте с малого и просто, постепенно добавляйте сложность, разрабатывайте новые функциональные возможности отдельно, тестируйте на каждом этапе и никогда не добавляйте код, который не работает. , Если вы все еще сталкиваетесь с проблемами и нуждаетесь в помощи, этот подход позволит легко сократить количество неисправного кода до минимально полного примера .
Теги:
list
function
map

1 ответ

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

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

Измените свою функцию создания:

void creation(std::map<std::string, Bunny> bunnies, std::list<std::string>names, int births)

в

void creation(std::map<std::string, Bunny>& bunnies, std::list<std::string>& names, int births)

Ещё вопросы

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