Откройте этот файл с помощью текстового редактора
<your python2 instalation path>\lib\site-packages\vaderSentiment\vaderSentiment.py
Добавьте эти строки вверху файла:
from io import open
#------------------
import os
import re
import math
import string
import requests
import json
from itertools import product
from inspect import getsourcefile
Я рад видеть, что Попытки все еще преподаются, они - важная структура данных, которой часто пропускают.
Может быть проблема проектирования в Вашем коде, так как у Вас должны, вероятно, быть класс Trie и класс Узла. Путем Вы записали это, похоже, что каждый узел в Вашем Trie является своим собственным trie, который может работать, но сделает некоторые вещи сложными.
Не действительно ясно из Вашего вопроса, чем случается так, что у Вас есть проблема с: расчет порядка или расчет фактического кода?
С названия итератора это кажется, что должно было бы работать в порядке префикса. Так как Ваш trie хранит слова, и его дочерние узлы организованы буквами, затем Вы, как по существу ожидают, пробежитесь через все слова в алфавитном порядке. Каждое приращение принесет Вам к следующему слову.
Инвариант о Вашем итераторе - то, что в любой точке (как долго, поскольку это допустимо), он должен указывать на узел с "символом разделителя" для допустимого слова. Полагение, что слово просто включает сканирование вверх через родительскую цепочку, пока Вы не находите свою всю строку. Перемещение в следующее слово означает делать поиск DFS: поднимитесь однажды, сканирование для ссылок в более поздних "братьях", посмотрите, находите ли Вы слово, если не рекурсивно повышаются, и т.д.
С одной стороны, показанный код на самом деле не описывает trie. Скорее это, кажется, дерево, содержащее пару элементов в каждом узле (T*
и unsigned
). Вы можете дисциплиной использовать дерево кортежей как trie, но это только условно, не осуществление. Это - часть того, почему у Вас есть такое трудное время, реализовывая operator++
.
То, что необходимо сделать, имеют каждого Trie
содержите лево-право, непересекающееся ADT, а не просто необработанные элементы. Это - слой абстракции, которая чаще всего находится на функциональных языках (например, Scala Любой). К сожалению, система типов C++ не достаточно довольно мощна, чтобы сделать что-то что изящный. Однако нет ничего препятствующего тому, чтобы Вы делали это:
template <class L, class R>
class Either
{
public:
Either(L *l) : left(l), right(0)
{}
Either(R *r) : left(0), right(r)
{}
L *get_left() const
{
return left;
}
R *get_right() const
{
return right;
}
bool is_left() const
{
return left != 0;
}
bool is_right() const
{
return right != 0;
}
private:
L *left;
R *right;
};
Затем Ваш Trie
элементы данных были бы определены следующим образом:
private:
Either<unsigned, T*> disjoint;
vector<Trie<T> *> children; // english pluralization
Trie<T> * parent;
Я играю быстро и свободный с Вашими указателями, но Вы получаете суть того, что я говорю. Важный бит - то, что никакой данный узел не может содержать обоих unsigned
и a T*
.
Попробуйте это и посмотрите, помогает ли это. Я думаю, что Вы найдете, что способность легко определить, являетесь ли Вы на листе или ответвлении, поможет Вам чрезвычайно в Вашей попытке выполнить итерации.
Можно хотеть видеть мои измененные trie реализации в:
А именно, можно найти обсуждение, которое я имел на comp.lang.c ++. модерируемый о реализации итераторов для trie's в STL совместимый путь, который является проблемой начиная со всех stl контейнеров, к сожалению, вынужден использовать станд.:: пара <>, и итератор для этого должна содержать значение вместо просто ссылки на единственный узел в trie.