Что такое Kotlin для C ++ push_back () и pop_back () для строки? - PullRequest
0 голосов
/ 15 февраля 2020

В C ++ создание и управление изменяемым стеком символов довольно просто. Я использую встроенный стандартный тип данных (std :: string), использую pu sh и функции pop, которые идут с ним и могут напрямую печатать результаты. Ничто из этого не требует создания дополнительных классов или функций.

#include <iostream>

int main()
{
    std::string path {};
    path.push_back('L');
    path.push_back('R');
    path.pop_back();
    std::cout << path;
}

Производит:

L 

Что такое Kotlin для C ++ push_back() и pop_back() в качестве стека символов?

Вопрос не в том, как я могу реализовать их как функции-члены в Kotlin.

C ++ Shell code

Ответы [ 2 ]

2 голосов
/ 15 февраля 2020

String являются неизменяемыми, поэтому вы не найдете точного эквивалента. В то время как StringBuilder обычно считается приемлемым строковым буфером, deleteCharAt копирует весь резервный массив .

Вы можете использовать setLength для этой цели. Обратите внимание, что как и std::string, это не делает ничего, кроме изменения внутренней длины строкового буфера:

val string = StringBuilder("Hello")
string.append(", world!")
string.setLength(string.length - 1)

В качестве альтернативы, используйте более функциональный подход и работайте с неизменяемые значения:

var string = "Hello"
string += ", world!"
string = string.dropLast(1)

Как уже говорилось другими ответчиками / комментаторами, если то, что вы действительно хотите, является стеком или деком, см. Deque и ArrayDeque (учитывая, что вы не упомянули std::stack или std::deque в своем вопросе, я не верю, что это так; не говоря уже о том, что стек символов не само по себе очень полезно.)


Принимая во внимание комментарий ОП, это должно быть идиоматическое c решение:

enum class Move {
    Left, Right, Forward
}

val moves = ArrayDeque<Move>()

// Push a move:
moves.push(Move.Left)

// Pop a move:
val lastMove = moves.pop()

См. также Почему я должен используйте Deque over Stack? для объяснения неудачной истории Java.

0 голосов
/ 15 февраля 2020

Я не совсем уверен, что это именно то, что вы имеете в виду, но Kotlin имеет функцию dropLast (param: количество символов для удаления), которая возвращает строку без количества символов, которое вы хотели удалить. Ссылка: https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.text/drop-last.html

Если вы ищете структуру данных стека, вы можете взглянуть на структуры данных Stack и Deque. https://chercher.tech/kotlin/deque-kotlin, https://chercher.tech/kotlin/stack-kotlin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...