我应该实现右值推送功能吗?我应该使用std::move吗
Should I implement rvalue push function and should I use std::move?
作为练习,我正在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);
正如预期的那样,第一次推送使用推送(T&&T(,而第二次推送则使用push(const T&T(。
我是否应该执行右值推送(即是否需要执行推送(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
如何进行一样
相关文章:
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 为什么我应该在异常处理中使用std::cerr而不是std::cout
- For-loop或std::any_of,我应该使用哪一个?
- 我应该使用std::seed_seq来种子std::mt19937吗
- 我应该移动 std::exchange ed 成员吗?
- C++:我应该在 return 语句中显式使用 std::move() 来强制移动吗?
- 我应该检查"std::string.c_str"是否为空吗?
- 最佳实践:我应该使用 std::thread、boost 还是本机调用
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- 我应该如何正确地播种C++11 std::d efault_random_engine
- 我应该将 std::string 与 "string" 或 "string" s 进行比较吗?
- 我应该使用 std::cerr 和 exit() 而不是抛出异常
- 我应该如何使 std::filesystem 看起来符合 Visual Studio 2015 的标准
- 我应该总是在构造函数中使用 std::move 吗?
- 我应该使用 std::atomic 还是 std::mutex 来避免线程竞争
- 在使用CPP中使用STD :: MAP之前,我应该致电清晰
- 我应该只使用 std::vector 吗?
- 我应该把这个使用push_back的代码改为使用std::move吗
- 如果我使用 std::function 来捕获 lambda,我应该担心它被解除分配吗?
- 我应该更喜欢 Rcpp::NumericVector 而不是 std::vector 吗?