Ваша проблема в этой строке:
TreeNode node = tree.at(i);
Здесь вы делаете копию узла, хранящегося в контейнере.Ваш последующий код изменяет эту копию, а не оригинал.В конце вы получаете доступ к оригиналу из контейнера, который не изменен.
Вместо этого используйте
TreeNode& node = tree.at(i);
, чтобы node
ссылался на объект, сохраненный в векторе.&
означает, что узел no - это не объект TreeNode
, а ссылка на объект TreeNode
.То есть каждый доступ к node
фактически будет обращаться к объекту, к которому он был привязан, то есть к объекту, возвращаемому tree.at(i)
.
Кстати, о вашем коде следует помнить и другие вещи.
Во-первых, вы сказали, что не можете использовать класс, но должны использовать структуру.В C ++ struct и class абсолютно одинаковы, за исключением того, что по умолчанию все элементы имеют открытые члены.То есть следующие два примера кода полностью эквивалентны:
struct X
{
int i;
int k;
};
и
class X
{
public:
int i;
int k;
};
Действительно, вы можете даже объявить ваш тип вперед с помощью struct
, а затем определить его с помощьюclass
или наоборот.
Необходимость использования struct
вместо class
может означать только одну из двух вещей: Либо вам нужно включить файл также в C (который не знает class
ключевое слово), но в любом случае вы не могли этого сделать, потому что C не знает ни вектор, ни строку.Или вам нужно, чтобы ваш класс был типом POD (обычные старые данные), но опять же ваши структуры не являются типами POD, потому что они имеют члены не-POD типов string
и vector<T>
.Другими словами, ваши структуры являются уже классами во всех смыслах этого слова.
В связанном узле, поскольку вы не можете включить определение своих структур в C, естьнет смысла использовать typedef
здесь.В C ++
struct Image
{
string Path;
int Votes;
};
уже позволяет вам ссылаться на тип с помощью Image
(в отличие от C, где вам нужно будет использовать struct Image
для ссылки на тип в этом случае).