我正在阅读Stroustrup的C++(3ed,1997),看看他是如何实现RAII的,在第365页我发现了这个:
class File_ptr{
FILE* p;
public:
File_ptr(const char* n, const char* a){p = fopen(n, a);}
File_ptr(FILE* pp) { p = pp; }
~File_ptr() {fclose(p);}
operator FILE* () {return p;}
};
Run Code Online (Sandbox Code Playgroud)
构造函数和析构函数的实现是显而易见的,并且符合RAII惯用法,但我不明白他为什么使用它operator FILE* () {return p;}.
这将导致以File_ptr下列方式使用:
FILE* p = File_ptr("myfile.txt", "r");
Run Code Online (Sandbox Code Playgroud)
结果是封闭的p,在这种情况下在语义上是不合适的.此外,如果File_ptr要用作RAII,则此运算符允许它像示例中那样被滥用.或者我错过了什么?
这是一个简化为连接两个索引的性能问题.采取以下设置:
CREATE TABLE ZZ_BASE AS SELECT dbms_random.random AS ID, DBMS_RANDOM.STRING('U',10) AS STR FROM DUAL CONNECT BY LEVEL <=1000000;
CREATE INDEX ZZ_B_I ON ZZ_BASE(ID ASC);
CREATE TABLE ZZ_CHILD AS SELECT dbms_random.random AS ID, DBMS_RANDOM.STRING('U',10) AS STR FROM DUAL CONNECT BY LEVEL <=1000000;
CREATE INDEX ZZ_C_I ON ZZ_CHILD(ID ASC);
-- As @Flado pointed out, the following is required so index scanning can be done
ALTER TABLE ZZ_BASE MODIFY (ID CONSTRAINT NN_B NOT NULL);
ALTER TABLE ZZ_CHILD MODIFY (ID CONSTRAINT NN_C NOT NULL); …Run Code Online (Sandbox Code Playgroud) 我在将参数传递给具有嵌套双引号的批处理函数时遇到问题.
以下是批处理文件的示例:
@SET path_with_space="c:\test\filenamewith space.txt"
@CALL :FUNCTION blaat1, "blaat2 %path_with_space%"
@GOTO :EOF
:FUNCTION
@echo off
echo arg 1: %~1
echo arg 2: %~2
echo arg 3: %~3
GOTO :EOF
Run Code Online (Sandbox Code Playgroud)
输出是:
arg 1: blaat1
arg 2: blaat2 "c:\test\filenamewith
arg 3: space.txt""
Run Code Online (Sandbox Code Playgroud)
我该怎么做arg 2: blaat2 "c:\test\filenamewith space.txt"?请注意,我无法调整功能或更改%path_with_space%.我只能控制传递给函数的内容.
我有这种情况,我无法解释为什么它编译:
#include <iostream>
using namespace std;
class X {
public:
X() {cout << "in X constructor: " << endl;};
};
class Y {
public:
Y() {cout << "in Y constructor" << endl;};
private:
X x[];
};
int main() {
Y y;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我正在定义一个可变大小的数组X作为类的成员Y.X在类之外定义它肯定会导致编译错误,但不会在类中.更重要的是,构造函数X永远不会被调用.
那么这里发生了什么?
假设我有以下张量t作为softmax函数的输出:
t = tf.constant(value=[[0.2,0.8], [0.6, 0.4]])
>> [ 0.2, 0.8]
[ 0.6, 0.4]
Run Code Online (Sandbox Code Playgroud)
现在我想将此矩阵t转换为类似于OneHot编码矩阵的矩阵:
Y.eval()
>> [ 0, 1]
[ 1, 0]
Run Code Online (Sandbox Code Playgroud)
我很熟悉c = tf.argmax(t)那会给我每行的指数t应该是1.但是从那里c开始Y似乎很难.
我已经尝试过转换t为tf.SparseTensor使用c然后使用tf.sparse_tensor_to_dense()来获取Y.但是这种转换涉及相当多的步骤并且对于任务来说似乎有点过头了 - 我甚至还没完成它,但我确信它可以工作.
有没有更合适/简单的方法来进行我失踪的转换.
我需要这个的原因是因为我在Python中有一个自定义的OneHot编码器,我可以在其中提供Y.tf.one_hot()不够广泛 - 不允许自定义编码.
相关问题:
假设你跑了 test.bat "blabla,blabla,^>blabla", "blaby"
test.bat实现:
@SETLOCAL
@ECHO OFF
SET list=%~1
ECHO "LIST: %list%"
ECHO "ARG 1: %~1"
ECHO "ARG 2: %~2"
@ENDLOCAL
@GOTO :EOF
Run Code Online (Sandbox Code Playgroud)
输出符合预期:
"LIST: blabla,blabla,>blabla"
"ARG 1: blabla,blabla,^>blabla"
"ARG 2: blaby"
Run Code Online (Sandbox Code Playgroud)
但是,如果在批处理文件中使test.bat成为一个函数,该怎么办:
@SETLOCAL
CALL :TEST "blabla,blabla,^>blabla", "blaby"
@ENDLOCAL
@GOTO :EOF
:TEST
@SETLOCAL
@ECHO OFF
SET list=%~1
ECHO "LIST: %list%"
ECHO "ARG 1: %~1"
ECHO "ARG 2: %~2"
@ENDLOCAL
@GOTO :EOF
Run Code Online (Sandbox Code Playgroud)
运行后输出为:
"LIST: blabla,blabla,^"
"ARG 1: blabla,blabla,^^>blabla"
"ARG 2: blaby"
Run Code Online (Sandbox Code Playgroud)
咦?
blabla列表中去了哪里?^^?为什么?有人可以解释特殊字符在函数参数中的行为方式与命令行参数不同吗?
假设我有以下具有以下约束的表:
create table test as (
select 1 as id, 'a' as name from dual
union all
select 2, 'b' from dual
union all
select 3, 'c' from dual
);
create unique index ind on test(name);
alter table test add constraint constr unique (name);
select * from test;
ID NAME
---------- ----
1 a
2 b
3 c
Run Code Online (Sandbox Code Playgroud)
现在假设我执行以下操作MERGE:
merge into test t using (
select 4 as id, 'b' as name from dual
union all
select 2 …Run Code Online (Sandbox Code Playgroud) 假设:
WITH t12 AS (SELECT * FROM t1 INNER JOIN t2 ON (t1.id = t2.id))
SELECT * FROM t12
Run Code Online (Sandbox Code Playgroud)
这将失败:
The column 'id' was specified multiple times for 't12'.
Run Code Online (Sandbox Code Playgroud)
现在这是一个大型查询,t1并且t2有很多(+200)列.我不是要列出所有内容:我明确要使用*.
通常我会用这个USING (id)子句解决这个问题,但是SQL Server似乎不支持这个.有任何想法吗?
其他选项是在没有WITH子句的情况下工作- 这有效但使代码的可读性降低.
SO上有很多答案可以列出所有字段.在WITH子句和纯SQL中,这是一个明确的问题.这里和此处的 "排除字段" 和视图之一的相关问题要求非ANSI SQL功能.这个问题是针对纯SQL的,如果SQL Server支持ANSI SQL-92语法,则可能(据我所知).
在C和变体中,当你有这样的东西时:
{
tmp1 <- 5
tmp2 <- 2
print(tmp1 + tmp2)
}
Run Code Online (Sandbox Code Playgroud)
将打印一个7,但是一旦范围结束,tmp1和tmp2变量将从堆栈中删除}.我有时想在R中使用类似的功能,这样我就不必在某个时间点之后清理(很多)临时变量.
在R中使这个工作的一种方法是这样的:
(function(){
tmp1 <- 5
tmp2 <- 2
print(tmp1 + tmp2)
})()
Run Code Online (Sandbox Code Playgroud)
现在看起来似乎有点hackish - 或者它可能只是我.
在R中有没有更好或更简洁(即更易阅读)的方法?
我正在寻找在 R 函数中模拟“静态”变量的方法。(我知道 R 不是编译语言......因此是引号。)对于 'static' 我的意思是 'static' 变量应该是持久的,与函数相关联并且可以从函数内部修改。
我的主要想法是使用该attr功能:
# f.r
f <- function() {
# Initialize static variable.
if (is.null(attr(f, 'static'))) attr(f, 'static') <<- 0L
# Use and/or modify the static variable...
attr(f, 'static') <<- attr(f, 'static') + 1L
# return something...
NULL
}
Run Code Online (Sandbox Code Playgroud)
这很好用,只要attr能找到f。在某些情况下,情况不再如此。例如:
sys.source('f.r', envir = (e <- new.env()))
environment(e$f) <- .GlobalEnv
e$f() # Error in e$f() : object 'f' not found
Run Code Online (Sandbox Code Playgroud)
理想情况下,我会attr在ffrom inside的“指针”上使用 …
我不明白为什么在这两种情况下我得不到相同的结果:
#include <iostream>
#include <vector>
#include <numeric> // for accumulate
#include <functional> // for plus()
using namespace std;
int main() {
long long i = (long long) 0xFFFFFFFF + 2;
cout << i << endl;
vector<int> v;
v.push_back(0xFFFFFFFF);
v.push_back(2);
long long r = accumulate(v.begin(), v.end(), 0, plus<long long>());
cout << r << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
任何想法?
编辑:正如下面正确指出的那,这是由于我没有指望的int中的符号位.0x7FFFFFFF显然会更好地进行测试.另外,我错误地期望plus()的返回类型与accumulate()的返回类型相同,但情况并非如此:它基于第三个参数.
$inputYN = Read-Host "(defaults to y in 10 sec) [y/n] ";
Run Code Online (Sandbox Code Playgroud)
如果用户在10秒内未提供任何输入,则默认值$inputYN应转到"是"并继续前进到下一个任务.