在Linux下,我有两个文件路径A和B:
const char* A = ...;
const char* B = ...;
Run Code Online (Sandbox Code Playgroud)
我现在想确定,我应该open(2)两个......
int fda = open(A, ...);
int fdb = open(B, ...);
Run Code Online (Sandbox Code Playgroud)
...我会在文件系统中打开两个文件句柄到同一个文件吗?
为了确定这一点,我想到了stat(2):
struct stat
{
dev_t st_dev;
ino_t st_ino;
...
}
Run Code Online (Sandbox Code Playgroud)
像(伪代码)的东西:
bool IsSameFile(const char* sA, const char* sB)
{
stat A = stat(sA);
stat B = stat(sB);
return A.st_dev == B.st_dev && A.st_ino == B.st_ino;
}
Run Code Online (Sandbox Code Playgroud)
有没有A和B是同一个文件但IsSameFile会返回false的情况?
是否有任何情况下A和B是不同的文件但IsSameFile会返回true?
有没有更好的方法来做我想做的事情?
假设下面的函数:
template<typename T, typename U>
bool IsRepresentable(U u);
Run Code Online (Sandbox Code Playgroud)
这T和U在非布尔整数类型。
如果整数值u是表示的T则IsRepresentable应该返回true,否则就应该返回false。
IsRepresentable在C ++ 17中实现的最佳方法是什么?(或者标准库中是否存在现有的类似功能?)
(我现在的想法是一个constexpr的if-else链围绕std::is_signed/ sizeof/ std::numeric_limits- ?但我错过了一些更容易或更简单的方法)
在C++20(最新草案)中,给出以下代码:
struct B { int mb; };
struct D : B { int md; };
Run Code Online (Sandbox Code Playgroud)
这六个表达式中哪些是格式错误的,哪些不是?
/*1*/ D{42, 43}
/*2*/ D{{42}, 43}
/*3*/ D{42, .md = 43}
/*4*/ D{{42}, .md = 43}
/*5*/ D{.mb = 42, .md = 43}
/*6*/ D{{.mb = 42}, .md = 43}
Run Code Online (Sandbox Code Playgroud) 请考虑以下 C++20 程序:
#include <iostream>
template<typename T>
struct A {
using X = typename T::X;
};
template<typename T>
constexpr bool WorksWithA = requires { typename A<T>; };
struct GoodArg {
using X = int;
};
struct BadArg {
};
int main() {
std::cout << WorksWithA<GoodArg> << std::endl;
std::cout << WorksWithA<BadArg> << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是畸形的吗?如果不是,输出应该是什么?
我期待输出是,1 0但我在 clang 中观察到1 1。谁是对的,为什么?
$ clang++ --version
clang version 10.0.0-4ubuntu1
$ clang++ test.cc -std=c++20
$ ./a.out
1
1
Run Code Online (Sandbox Code Playgroud) gcc/Linux 使用的 C++ ABI/重整方案称为Itanium C++ ABI。Mangling 是第 5.1 节。
除了这个之外,还有多少其他常用的 C++ ABI 和重整方案?他们叫什么?
(例如,我假设 MSVC 和 Windows 有自己的一个?它叫什么?它在某处有记录吗?)
我有一个程序可以创建一个html文件作为标准输出。要在vim中查看它,我只需要:
$ foo2html foo | vim -
Run Code Online (Sandbox Code Playgroud)
vim将以标准输入读取启动以供查看。关闭vim后,命令将返回。
是否有一些命令行开关组合可以使google-chrome做到这一点?
(对于具体的编译器/平台上下文,请在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)它从不同的线程上下文不同步?
断言在什么情况下会引发火灾?两个线程会得到相同的数据吗?怎么可能出错?