我已经编程了一段时间,但它主要是Java和C#.我实际上从来没有必须自己管理内存.我最近开始用C++编程,我有点困惑的是什么时候我应该把东西存放在堆栈上以及何时将它们存储在堆上.
我的理解是,非常频繁访问的变量应该存储在堆栈中,对象,很少使用的变量和大型数据结构都应该存储在堆上.这是正确的还是我错了?
哪些头文件为不同的x86 SIMD指令集扩展(MMX,SSE,AVX,...)提供内在函数?似乎不可能在网上找到这样的清单.如我错了请纠正我.
我遇到了一个涉及静态泛型方法的奇怪情况.这是代码:
class Foo<E>
{
public static <E> Foo<E> createFoo()
{
// ...
}
}
class Bar<E>
{
private Foo<E> member;
public Bar()
{
member = Foo.createFoo();
}
}
Run Code Online (Sandbox Code Playgroud)
为什么我不必在表达式中指定任何类型参数Foo.createFoo()?这是某种类型推断吗?如果我想明确它,我如何指定类型参数?
map :: (a -> b) -> [a] -> [b]
fmap :: Functor f => (a -> b) -> f a -> f b
liftM :: Monad m => (a -> b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)
为什么我们有三个不同的功能,基本上是一样的?
我已经确定了四种不同的插入方式std::map:
std::map<int, int> function;
function[0] = 42;
function.insert(std::map<int, int>::value_type(0, 42));
function.insert(std::pair<int, int>(0, 42));
function.insert(std::make_pair(0, 42));
Run Code Online (Sandbox Code Playgroud)
哪一种是首选/惯用的方式?(还有另一种我没想过的方法吗?)
我允许将元素移出std::initializer_list<T>?
#include <initializer_list>
#include <utility>
template<typename T>
void foo(std::initializer_list<T> list)
{
for (auto it = list.begin(); it != list.end(); ++it)
{
bar(std::move(*it)); // kosher?
}
}
Run Code Online (Sandbox Code Playgroud)
由于std::intializer_list<T>需要特殊的编译器注意并且没有像C++标准库的普通容器那样的值语义,所以我宁愿安全而不是抱歉并且问.
可能重复:
c ++ 0x中的递归lambda函数
这是一个普通的旧递归函数:
int fak(int n)
{
return (n <= 1) ? 1 : n * fak(n - 1);
}
Run Code Online (Sandbox Code Playgroud)
我如何编写像lambda函数这样的递归函数?
[](int n) { return (n <= 1) ? 1 : n * operator()(n - 1); }
// error: operator() not defined
[](int n) { return (n <= 1) ? 1 : n * (*this)(n - 1); }
// error: this wasn't captured for this lambda function
Run Code Online (Sandbox Code Playgroud)
是否有任何表达当前lambda的表达式,因此它可以递归调用自身?
算法解决方案
std::generate(numbers.begin(), numbers.end(), rand);
Run Code Online (Sandbox Code Playgroud)
基于范围的for-loop解决方案:
for (int& x : numbers) x = rand();
Run Code Online (Sandbox Code Playgroud)
为什么我要std::generate在C++ 11中使用更冗长的基于范围的for循环?
struct X
{
X() { std::cout << "X()\n"; }
X(int) { std::cout << "X(int)\n"; }
};
const int answer = 42;
int main()
{
X(answer);
}
Run Code Online (Sandbox Code Playgroud)
我本来希望这打印
X(int),因为X(answer);可以解释为铸件从int到X,或X(answer);可以解释为变量的声明.但是,它打印X(),我不知道为什么X(answer);会调用默认构造函数.
奖励积分:我需要更改什么才能获得临时而非变量声明?
我最近发现了以下代码:
IntPredicate neg = x -> x <- x;
Run Code Online (Sandbox Code Playgroud)
这是什么,某种反向双lambda?
c++ ×6
c++11 ×3
java ×2
lambda ×2
stl ×2
syntax ×2
algorithm ×1
c++-faq ×1
foreach ×1
functor ×1
generics ×1
haskell ×1
header-files ×1
heap ×1
insert ×1
intrinsics ×1
java-8 ×1
list ×1
monads ×1
obfuscation ×1
recursion ×1
redundancy ×1
simd ×1
sse ×1
stack ×1
static ×1
std-pair ×1
stdmap ×1
templates ×1
x86 ×1