Tag: c ++ 11

从队列中删除unique_ptr

我想弄清楚如何在queue使用unique_ptr 。 // create queue std::queue<std::unique_ptr<int>> q; // add element std::unique_ptr<int> p (new int{123}); q.push(std::move(p)); // try to grab the element auto p2 = foo_queue.front(); q.pop(); 我明白为什么上面的代码不起作用。 由于front和front是两个独立的步骤,因此元素不能移动。 有没有办法做到这一点?

基于constexpr的计算图灵完成?

我们知道C ++模板元编程是图灵完备的 ,但是预处理元编程不是 。 C ++ 11为我们提供了一种新的元编程forms:计算constexpr函数。 这种计算forms是否是图灵完成的? 我在想,因为recursion和条件运算符(?:)在constexpr函数中是允许的,但是我希望有更多专业知识的人来确认。

为什么在C ++ 11中改变了std :: vector :: resize签名?

std::vector::resize从pre-C ++ 11中改变的原因是什么? void resize( size_type count, T value = T() ); 到兼容的C ++ 11表单: void resize( size_type count ); void resize( size_type count, const value_type& value);

在现代C ++(C ++ 11及以上版本)中正确初始化variables,使用()或{}?

C ++参考页面指出()用于值初始化,{}用于值和聚合和列表初始化。 所以,如果我只想要初始化值,我使用哪一个? () 要么 {}? 我在问,因为在Bjarne本人的“C ++游览”一书中,他似乎更喜欢使用{},甚至对于值初始化(例如参见第6页和第7页),所以我认为总是很好的做法使用{},即使是值初始化。 不过 ,最近我被下面的bug吓坏了。 考虑下面的代码。 auto p = std::make_shared<int>(3); auto q{ p }; auto r(p); 现在根据编译器(Visual Studio 2013), qtypesstd::initializer_list<std::shared_ptr<int>> ,这不是我的意图。 我实际上想要的q实际上是r是什么,这是std::shared_ptr<int> 。 所以在这种情况下,我不应该使用{}来进行值初始化,而是使用()。 鉴于此,为什么Bjarne在他的书中似乎仍然倾向于使用{}来进行值初始化? 例如,他在第6页的底部使用了double d2{2.3} 。 为了明确地回答我的问题,我应该什么时候使用()以及何时使用{}? 这是语法正确还是编程实践的问题? 哦,呃,如果可能的话请用简单的英语。 编辑:这似乎是我稍微误解了价值初始化 (见下面的答案)。 但是,上述问题仍然存在。

默认成员值是最佳实践

当编写C ++ 11代码来为类的头文件中的类成员设置默认值时,是不是很好的做法? 还是在这个类的构造函数中做这个更好? 编辑: 我的意思是: foo.h : #include <string> using std::string; class Foo{ private: string greet = "hello"; public: Foo(); }; VS foo.cpp (当然有必要的头文件,但没有在类初始化): Foo::Foo(){ greet = "hello"; } 哪一个更好,为什么?

什么是性能明智的产生随机布尔最好的方法?

我需要在性能关键path上生成随机布尔值。 我为此编写的代码是 std::random_device rd; std::uniform_int_distribution<> randomizer(0, 1); const int val randomizer(std::mt19937(rd())); const bool isDirectionChanged = static_cast<bool>(val); 但不要认为这是做这个的最好方法,因为我不喜欢做static_cast<bool> 。 在网上我发现了一些更多的解决scheme 1. std::bernoulli_distribution 2. bool randbool = rand() & 1; 记得在开始时调用srand() 。

错误:: make_unique不是“std”的成员

我正在编译下面的代码审查上发布的线程池程序来testing它。 https://codereview.stackexchange.com/questions/55100/platform-independant-thread-pool-v4 但是我得到的错误 threadpool.hpp: In member function 'std::future<decltype (task((forward<Args>)(args)…))> threadpool::enqueue_task(Func&&, Args&& …)': threadpool.hpp:94:28: error: 'make_unique' was not declared in this scope auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>> (std::move(bound_task), std::move(promise)); ^ threadpool.hpp:94:81: error: expected primary-expression before '>' token auto package_ptr = make_unique<task_package_impl<R, decltype(bound_task)>>(std::move(bound_task), std::move(promise)); ^ main.cpp: In function 'int main()': main.cpp:9:17: error: 'make_unique' is not a member […]

有没有一种方法可以迭代至多N个元素使用基于范围的循环?

我想知道是否有一个很好的方法来遍历一个容器中的最多N个元素,使用基于循环的范围和/或标准库中的algorithm(这就是整个问题,我知道我可以使用“old “为条件循环)。 基本上,我正在寻找对应于这个Python代码的东西: for i in arr[:N]: print(i)

为什么std :: pair比std :: tuple快

这里是testing的代码。 元组testing: using namespace std; int main(){ vector<tuple<int,int>> v; for (int var = 0; var < 100000000; ++var) { v.push_back(make_tuple(var, var)); } } 配对testing: #include <vector> using namespace std; int main(){ vector<pair<int,int>> v; for (int var = 0; var < 100000000; ++var) { v.push_back(make_pair(var, var)); } } 我通过Linux时间命令做了时间测量。 结果是: | | -O0 | -O2 | […]

有一个标准的方法将范围移动到vector中吗?

考虑下面的程序,它将一系列元素插入到一个向量中: vector<string> v1; vector<string> v2; v1.push_back("one"); v1.push_back("two"); v1.push_back("three"); v2.push_back("four"); v2.push_back("five"); v2.push_back("six"); v1.insert(v1.end(), v2.begin(), v2.end()); 这有效地复制范围,在整个范围内为目标向量分配足够的空间,以便最大限度地调整一个大小。 现在考虑下面这个试图将范围移入向量的程序: vector<string> v1; vector<string> v2; v1.push_back("one"); v1.push_back("two"); v1.push_back("three"); v2.push_back("four"); v2.push_back("five"); v2.push_back("six"); for_each ( v2.begin(), v2.end(), [&v1]( string & s ) { v1.emplace_back(std::move(s)); }); 这将执行一个成功的移动,但是不能享受insert()在预先分配目标向量中的空间方面的好处,所以在操作过程中可以重新调整向量的大小。 所以我的问题是,有一个插入等价物可以将范围移动到一个向量?