(对于具体的编译器/平台上下文,请在x86_64上使用GCC 4.7和Ubuntu 12.04)
给定一些函数f:
void f(int x, int y);
int nx = ...;
int ny = ...;
Run Code Online (Sandbox Code Playgroud)
迭代从(0,0)到(nx,ny)的每个值(x,y)的一种方法是:
for (int x = 0; x < nx; x++)
for (int y = 0; y < ny; y++)
f(x,y);
Run Code Online (Sandbox Code Playgroud)
让这个编译成一些生成的代码Q1.
我们将编写一个函数g,使得:
for (auto it : g(Z))
f(it.x, it.y);
Run Code Online (Sandbox Code Playgroud)
编译成代码Q2.
有可能写出这样的Q2,Q2和Q1一样有效吗?如果有,怎么样?如果没有,我们能得到的最接近的是什么?
如果有帮助,您可以将auto更改为auto&或auto &&.
您也可以将it.x更改为it.x(),并将it.y更改为it.y(),如果有帮助的话.
(回想一下,基于范围的扩展只是你选择的迭代器类型:C++ 11:基于范围的for语句:"range-init"生命周期?)
(这来自最近完成的编程竞赛)
给出G,一个具有N个节点和N-1个边的连通图.
(请注意,这意味着G形成一棵树.)
G的每个边缘都是定向的.(不一定向上到任何根)
对于G的每个顶点v,可以反转零个或多个边缘,使得存在从每个其他顶点w到v的有向路径.让实现此目的的最小可能的边缘反转数量为f(v).
通过线性或对数线性算法,我们可以确定具有最小整体f(v)的顶点子集(包括那些顶点的f(v)的值)?
例如,考虑具有这些边的4顶点图:
A<--B
C<--B
D<--B
Run Code Online (Sandbox Code Playgroud)
f(A)的值= 2,f(B)= 3,f(C)= 2,f(D)= 2 ......
因此,所需的输出是{A,C,D}和2
(注意我们只需要计算具有最小f(v)的顶点的f(v) - 而不是所有顶点
码:
对于后代,这里是解决方案的代码:
int main()
{
struct Edge
{
bool fwd;
int dest;
};
int n;
cin >> n;
vector<vector<Edge>> V(n+1);
rep(i, n-1)
{
int src, dest;
scanf("%d %d", &src, &dest);
V[src].push_back(Edge{true, dest});
V[dest].push_back(Edge{false, src});
}
vector<int> F(n+1, -1);
vector<bool> done(n+1, false);
vector<int> todo;
todo.push_back(1);
done[1] = true;
F[1] = 0;
while (!todo.empty())
{
int next = todo.back();
todo.pop_back();
for (Edge …Run Code Online (Sandbox Code Playgroud) 假设我有一个T型:
typedef ... T;
Run Code Online (Sandbox Code Playgroud)
然后我有这些功能:
T f11();
T& f12();
T&& f13();
const T f21();
const T& f22();
const T&& f23();
Run Code Online (Sandbox Code Playgroud)
然后像这样调用它们:
auto x11 = f11();
auto x12 = f12();
auto x13 = f13();
auto x21 = f21();
auto x22 = f22();
auto x23 = f23();
Run Code Online (Sandbox Code Playgroud)
从哪个C++ 11标准的section /子句可以推导出x11..x23的等效非自动声明?
这样做是否安全:
int fd;
void thread_main()
{
char buf[M];
ssize_t r = read(fd, buf, M);
assert(r == M);
...
}
int main()
{
fd = open("/dev/urandom", O_RDONLY);
for (int i = 0; i < N; i++)
start_thread(i);
for (int i = 0; i < N; i++)
join_thread(i);
}
Run Code Online (Sandbox Code Playgroud)
也就是说:在open(2)荷兰国际集团"/dev/urandom"从主线程,是安全的read(2)它从不同的线程上下文不同步?
断言在什么情况下会引发火灾?两个线程会得到相同的数据吗?怎么可能出错?
我很确定整数,字符,布尔值和浮点文字的值类别是prvalue.
用户定义的文字类似于函数调用,因此它们的值类别取决于它们解析的运算符函数的返回类型.
我不清楚字符串文字.它们的类型为"const charx数组",其中charx是一些字符类型.
它在3.10中说:
文字的价值......也是一个价值.
但我认为这可能不适用于字符串文字?
字符串文字的值类别是什么?你是怎么决定的?
我有一个像:
enum E
{
TYPE_FLOAT,
TYPE_CHAR,
TYPE_INT
}
Run Code Online (Sandbox Code Playgroud)
我想创建一个编译时映射,以获得适合类型的E:
GetE<float> // returns TYPE_FLOAT
GetE<char> // returns TYPE_CHAR
GetE<int> // returns TYPE_INT
Run Code Online (Sandbox Code Playgroud)
我想到了:
template<class T> struct GetE;
template<> struct GetE<float> { static constexpr E type = TYPE_FLOAT; };
template<> struct GetE<char> { static constexpr E type = TYPE_CHAR; };
template<> struct GetE<int> { static constexpr E type = TYPE_INT; };
Run Code Online (Sandbox Code Playgroud)
但我得到的错误如下:
undefined reference to `GetE<int>::type'
Run Code Online (Sandbox Code Playgroud)
什么是最好的方法呢?为什么错误呢?
在 C++ 标准 18.4 中指定:
typedef 'signed integer type' intmax_t;
Run Code Online (Sandbox Code Playgroud)
long int根据 64 位和 64 位平台上的标准,long long int这个“有符号整数类型”应该是什么?
请注意,long int和long long int是不同的基本类型。
C++ 标准说:
头文件定义了所有函数、类型和宏,与 C 标准中的 7.18 相同。
C 标准 (N1548) 的 7.18 中写道:
以下类型指定能够表示任何有符号整数类型的任何值的有符号整数类型:
Run Code Online (Sandbox Code Playgroud)intmax_t
long int在这种情况下,和似乎都long long int符合条件?
这是正确的结论吗?这两者都是符合标准的选择吗?
它在C++ 3.3.7.2 [basic.scope.class]中说
N类中使用的名称S应在其上下文中引用相同的声明,并在完成的范围内重新评估S.
什么是翻译单元的示例,其中N类中使用的名称S在其上下文中引用的是与在完成的范围内重新评估时不同的声明S?
在C++ 11 3p3中,它指出:
实体是值,对象,引用,函数,枚举器,类型,类成员,模板,模板特化,命名空间,参数包或此.
在17.6.1.1p1中,它指出:
C++标准库提供以下类型实体的定义:宏,值,类型,模板,类,函数,对象.
什么是C++标准库为(不是对象?)和对话提供定义的值的示例:C++标准库为其定义的对象的示例是什么,不是值?
以下C++ 1y/C++ 14程序是否格式错误?
template<class> constexpr auto X = 42;
int main()
{
static_assert(X<int> == 42, "");
}
Run Code Online (Sandbox Code Playgroud)
为什么/为什么不呢?
Clang trunk抱怨说:
error: invalid operands to binary expression ('auto' and 'int')
Run Code Online (Sandbox Code Playgroud)