我应该实现右值推送功能吗?我应该使用std::move吗?
Should I implement rvalue push function and should I use std::move?
作为练习,我正在用 C++11 实现堆栈 class。
这是相关代码:
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);
}
}
};
我使用 class 如下:
stack<std::string> stack_test(2);
stack_test.push("string1");
std::string string2 = "string2";
stack_test.push(string2);
不出所料,第一次推送使用push(T && t),而第二次推送使用push(const T & t).
我是否应该实施右值推送(即 push(T && t) 是否需要实施)?
我应该在其中使用 std::move() 吗?
鉴于您在两个 push
中存储 t
,您可以有 一个
void push(T t)
{
if (capacity > count)
{
elements[count++] = std::move(t);
}
}
但实际上,您应该使用 std::vector<T> elements;
(或 std::deque
/ std::list
),就像 std::stack
那样
作为练习,我正在用 C++11 实现堆栈 class。
这是相关代码:
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);
}
}
};
我使用 class 如下:
stack<std::string> stack_test(2);
stack_test.push("string1");
std::string string2 = "string2";
stack_test.push(string2);
不出所料,第一次推送使用push(T && t),而第二次推送使用push(const T & t).
我是否应该实施右值推送(即 push(T && t) 是否需要实施)?
我应该在其中使用 std::move() 吗?
鉴于您在两个 push
中存储 t
,您可以有 一个
void push(T t)
{
if (capacity > count)
{
elements[count++] = std::move(t);
}
}
但实际上,您应该使用 std::vector<T> elements;
(或 std::deque
/ std::list
),就像 std::stack
那样