Как создать несколько объектов в одной функции, но не перезаписывая друг друга?
Вопрос
Я пытаюсь создать объект в функции, но столкнулся с проблемой, заключающейся в том, что имена переменных необходимо определять во время выполнения.Могу ли я что-нибудь сделать с массивами, что позволит динамически создавать переменную в функции и желательно давать ей имя, отличное от того, которое было создано при последнем вызове функции?
***Я работаю на C++
РЕДАКТИРОВАТЬ:Я не могу дать код, потому что у меня его сейчас нет.Все, что у меня сейчас есть, это псевдокод.
По сути, я пытаюсь создать связанный список, но метод addNewItem(), который я хочу использовать, потребует использования одного и того же метода для создания разных объектов.
РЕДАКТИРОВАТЬ:Технически, мы не составляем список ссылок, а просто проверяем концепцию, чтобы понять, как они работают.
РЕДАКТИРОВАТЬ:Вот код:
#include "linklist.h"
#include <iostream>
using namespace std;
struct linklist
{
Student * obj;
linklist * next;
};
linklist * head;
int main()
{
}
void addStudent(char * newsdnt)
{
if(!head){
linklist * a = new linklist;
a->obj = new Student(newsdnt);
a->next = 0;
head = a;
return;
}else{
linklist * a = new linklist;
a->obj = new Student(newsdnt);
a->next = 0;
if(!head->next){
head->next = a; // Can only have one or two items in list
}
}
}
Решение
Если вам нужен связанный список, вызовите new, чтобы создать каждый новый узел, а затем добавьте его в список.
Что-то вроде этого:
void addStudent(char * newsdnt)
{
linklist* a = new linklist;
a.obj = new Student(newsdnt);
a.next = 0;
if( head == 0 ) {
head = a;
} else {
linklist* whereToAdd = head;
while( whereToAdd.next != 0 ) {
whereToAdd = whereToAdd.next;
}
whereToAdd.next = a;
}
}
Другие советы
Самый простой способ создать (одно) связанный список — добавить новый элемент в начало:
linklist *head = 0;
...
a->next = head;
head = a;
...
Если допустимо добавлять элементы в хвост за время O(N), то вы каждый раз просматриваете список, чтобы найти конец.
linklist head;
...
a->next = 0;
item = &head;
while (item->next != 0)
item = item->next;
item->next = a;
...
Если вам необходимо добавить новые элементы в хвост списка за время O(1), сохраните круговой список и указатель на хвост списка (чтобы tail->next
является указателем на начало списка).(Предыдущие структуры списков можно было бы назвать «открытыми».)
linklist root = { 0, &root };
linklist *tail = &root;
...
a->next = tail;
tail->next = a;
...
Остерегаться:условия завершения перебора всего списка (например.для поиска элемента в списке) различаются в зависимости от используемой структуры (круглая или открытая).
Предостережение:непроверенный код!
Если вы не уверены, что означают O(1) и O(N), прочтите нотацию «Big O».
Я бы предложил вектор:
#include <vector>
using namespace std;
void foo()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
cout << v[0] + v[1] << endl;
}
Предполагая, что вам нужно N
объекты какого-то типа T
:Массивы широко распространены в C++.Так же как и STL, который предоставляет вам множество возможностей.Вам необходимо определить, как вы хотите получать доступ к этим объектам и использовать их — это влияет на выбор вашего контейнера.Но можете ли вы опубликовать код, чтобы наши ответы были менее расплывчатыми (и более полезными для вас)?
Я не совсем уверен, чего вы хотите, но похоже, что вы могли бы использовать Мультисет.
Пожалуйста, предоставьте более подробную информацию, и я, возможно, смогу оказать дополнительную помощь.
Для начала я бы предложил вам переименовать структуру связанного списка в node и добавить новую структуру связанного списка, которая содержит заголовок и (возможно) текущие/хвостовые указатели.Затем вам следует реализовать в этом классе/структуре методы, которые позволят вам манипулировать им.
Чего вам сейчас не хватает, так это метода, который будет проходить по списку (рекурсивно получая следующий указатель, пока вы не окажетесь в конце) и возвращать указатель на последний элемент.Получив это, вы можете установить следующий указатель этого элемента на ваш вновь созданный объект.