char*
и почему ты не можешь работать конкретно с типом const char*
? Не знаю как ковычку то заковычить.
'\',
. Символ \
экранирует следующую кавычку, поэтому компилятор не видит конца последовательности твоего символа. А дальше у тебя уже весь текст инициализации становится неправильным.'\\'
. Обратный слеш в этом месте экранирует сам себя. Obj newO = arr[arr.size()-1];
Obj& newO = arr.back();
arr.insert(arr.begin(), std::move(arr.back()));
arr.pop_back();
Book
, ты расширяешь внешний интерфейс именно для Book
, но не для какого-либо иного типа. UPD: Вопрос решён. Помогла функция glutTimerFunc(), убираем glutPostRedisplay() из idle-функции, создаём таймер с обновлением в 1000/FPS_LIMIT миллисекунд и создаём новый таймер в том таймере, тем самым таймер создаёт другой таймер и так по кругу.
std::vector<std::string>
, а std::set<std::string>
и все те же две std::unordered_map<std::string_view, std::string_view>
. Set позаботится о том, чтобы хранить только уникальные строки. У std::set
, кстати, тоже есть функция emplace
. std::map
, а std::unordered_nap
. Тебе стоит самостоятельно понять принципиальную разницу этих контейнеров и почему первый в твоей задаче непригоден.std::unordered_map<std::string, std::string>
. Первый контейнер хранит прямой перевод, второй - обратный перевод. Контейнеров два т.к. слова в разных языках могут писаться одинаково, а значения у них могут быть разные и переводы, следовательно, тоже разные.emplace
. Изучи документацию и найди для себя обоснование - почему именно эта функция будет эффективнее всего работать с парой std::string_view
в качестве параметров.std::string
в качестве параметров шаблона std::unordered_nap
таково, что TranslateForward
возвращает std::string_view
, который не владеет памятью на которую ссылается. Вместе с этим, тип std::string_view
не рассматривается как тип долгосрочного хранения (рассматривать его как долгосрочное хранилище - в большинстве случаев опасно). Такая сигнатура требует от Translator
владеть памятью строк возвращаемых из функций Translate*
. В самой задаче использование string_view оправдано экономией памяти.
Translator::Add(string("first"), string("second"))
- первое выделение делается вот тут. Зачем?data.emplace_back(first)
- второе выделение делается вот тут и ниже во втором emplace_back
.