Должен ли я реализовать функцию rvalue pu sh и использовать ли std :: move? - PullRequest
0 голосов
/ 21 февраля 2020

В качестве упражнения я реализую класс стека на C ++ 11.
Это соответствующий код:

template <class T>
class stack
{
private:
    T * elements;
    std::size_t capacity;
    std::size_t count;

public:
    explicit stack(std::size_t capacity) : capacity(capacity)
    {
        elements = new T[capacity];
    };

    ~stack()
    {
        delete[] elements;
    };

    void push(const T & t)
    {
        if (capacity > count)
        {
            elements[count++] = t;
        }
    }

    void push(T && t)
    {
        if (capacity > count)
        {
            elements[count++] = std::move(t);
        }
    }
};

Я использую класс следующим образом:

stack<std::string> stack_test(2);
stack_test.push("string1");

std::string string2 = "string2";
stack_test.push(string2);

Как и ожидалось, первый pu sh использует pu sh (T && t) , тогда как второй pu sh использует pu sh (const T & t) .

Должен ли я реализовать значение pu sh (т. е. требуется ли pu sh (T && t) для реализации)?
И я должен использовать std :: move () в этом?

1 Ответ

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

Учитывая, что вы храните t в обоих push es, вы можете иметь one

void push(T t)
{
    if (capacity > count)
    {
        elements[count++] = std::move(t);
    }
}

Но на самом деле вы должны использовать std::vector<T> elements; (или std::deque / std::list), как std::stack делает

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