我是一个bash新手.我想数字1呼应x的n数字格式.例如,让我们考虑n=3:5应该变为005,13应该变为013,110应该保持110.
实现这一目标的一种方法是使用这种结构:
for i in $(seq 1 120)
do
if [ "$i" -lt "10" ]
then
echo "00$i"
elif [ "$i" -gt "99" ]
then
echo "$i"
else
echo "0$i"
fi
done
Run Code Online (Sandbox Code Playgroud)
但它非常难看,并且在改变n(位数)的值时实际上并不灵活.我宁愿有一个只用n数字格式化的函数?是否已经内置了功能?如果没有,你可以帮我创建这样的功能吗?
主要问题
我做到了
> `+` = `-`
> 5 + 2
[1] 3
Run Code Online (Sandbox Code Playgroud)
如何在不重新启动控制台的情况下"回滚"?干
> `+` = sum
Run Code Online (Sandbox Code Playgroud)
当然,恢复一个+但不是全部的功能.例如
> c(3,4) + c(1,2)
[1] 10
Run Code Online (Sandbox Code Playgroud)
我怎样才能恢复其他功能+呢?
额外的相关问题
这种"任务"或"+"和" - "代表的功能是否有名称?
可以使用哪些术语来区分函数"+"和可以创建的函数"%+%"
`%+%` = function(x,y){print(paste(x,"+",y,"=",x+y))}
Run Code Online (Sandbox Code Playgroud) 我试图创建一个Append不返回值但直接扩展第一个变量的函数.目前,要追加y到x我做的
x = append(x,y)
Run Code Online (Sandbox Code Playgroud)
我希望能够做到
Append(x,y)
Run Code Online (Sandbox Code Playgroud)
并得到相同的结果.我首先想到的是类似的东西
Append = function(a,b,VarName) assign(VarName,append(a,b), envir = .GlobalEnv)
Append(x,y,"x")
Run Code Online (Sandbox Code Playgroud)
它有效,但必须传递原始变量的名称是非常不满意的.有更好的解决方案吗?
考虑这种比较:
require(Rcpp)
require(microbenchmark)
cppFunction('int cppFun (int x) {return x;}')
RFun = function(x) x
x=as.integer(2)
microbenchmark(RFun=RFun(x),cppFun=cppFun(x),times=1e5)
Unit: nanoseconds
expr min lq mean median uq max neval cld
RFun 302 357 470.2047 449 513 110152 1e+06 a
cppFun 2330 2598 4045.0059 2729 2879 68752603 1e+06 b
Run Code Online (Sandbox Code Playgroud)
cppFun似乎慢了RFun.为什么会这样?调用函数的时间有所不同吗?或者是运行时间不同的功能本身?是传递和返回参数的时间吗?是否有一些数据转换或数据复制我不知道何时将数据传递给(或从中返回)cppFun?
我的代码花了40%的时间来搜索未分类的向量.更具体地,搜索功能my_search重复地接收单个未分类的长度矢量N,其中N可以取10到100,000之间的任何值.与每个元素相关联的权重具有相对小的方差(例如[0.8,0.81,0.85,0.78,0.8,0.7,0.84,0.82,...]).
该算法my_search首先对每个对象的所有权重求和,然后N用替换样本计算元素的平均值(与向量的长度一样多).该算法非常类似于
int sum_of_weight = 0;
for(int i=0; i<num_choices; i++) {
sum_of_weight += choice_weight[i];
}
int rnd = random(sum_of_weight);
for(int i=0; i<num_choices; i++) {
if(rnd < choice_weight[i])
return i;
rnd -= choice_weight[i];
}
Run Code Online (Sandbox Code Playgroud)
从这篇文章.
我可以在搜索之前对矢量进行排序,但是需要O(N log N)的顺序(取决于所使用的排序算法)并且我怀疑(但可能是错误的,因为我没有尝试过)我会获得很多时间特别是因为权重几乎没有变化.
另一种解决方案是存储在一系列点之前有多少重量的信息.例如,在对矢量求和时,每N/10个元素,我可以存储已经总和了多少权重的信息.然后,我可以首先与rnd这10个断点进行比较,并仅搜索向量总长度的十分之一.
N?这是一个可重现的代码
#include <iostream>
#include <vector>
#include <algorithm>
class X
{
public:
int a;
X(int b)
: a(b)
{}
};
int main()
{
// Build the vector 'v'
std::vector<X> v;
X x1(7);
v.push_back(x1);
X x2(11);
v.push_back(x2);
X x3(16);
v.push_back(x3);
X x4(20);
v.push_back(x4);
X x5(22);
v.push_back(x5);
X x6(31);
v.push_back(x6);
X x7(38);
v.push_back(x7);
// Search if there is an element of 'v' which attribute 'a' equals 18
int y(18);
if (
std::find(
v.begin(),
v.end(),
[&](const X& o){return o.a == y;}
) == v.end() …Run Code Online (Sandbox Code Playgroud) 当我们做...
template <typename T>
void foo(T x)
{
if (is_fundamental<T>::value)
{
...
} else
{
...
}
}
Run Code Online (Sandbox Code Playgroud)
我认为if声明(以及is_fundamental<T>::value)在运行时进行评估,是吗?
如果是,是否有办法在编译时进行此评估?我希望有类似......
template <primitive_typename T>
void foo(T x)
{
...
}
template <noPrimitive_typename T>
void foo(T x)
{
...
}
Run Code Online (Sandbox Code Playgroud)
一种解决方案是重载每种可能的原始类型,但它并不是一个令人满意的解决方案,因为它需要多次复制基本类型的代码.有没有办法用一个类型名称来引用所有原语?
这是一个标签调度的简单示例
template <typename T>
void foo(T x, std::true_type)
{
std::cout << "A primitive type\n";
}
template <typename T>
void foo(T x, std::false_type)
{
std::cout << "Not a primitive type\n";
}
template <typename T>
void foo(T x) {
foo(x, std::is_fundamental<T>{});
}
int main()
{
int a = 3;
std::vector<int> v = {1,2,3};
foo(a);
foo(v);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想做类似但涉及课程的事情.就像是
template <typename T, std::true_type>
class C
{
public:
T x;
void foo()
{
std::cout << "A primitive type\n";
}
C(T i):x(i){};
};
template …Run Code Online (Sandbox Code Playgroud) 在 Golang 中,一切都是按值传递的。如果我“直接”传递一个数组(而不是通过指针传递它),那么在函数中所做的任何修改都将在函数外部找到
func f(a []int) {
a[0] = 10
}
func main() {
a := []int{2,3,4}
f(a)
fmt.Println(a)
}
Output: [10 3 4]
Run Code Online (Sandbox Code Playgroud)
这是因为,据我了解,数组(除其他外)构成了指向底层数据数组的指针。
除非我弄错了(请参阅此处),字符串还构成(与“len”对象一起)unsafe.Pointer指向基础数据的指针(a)。因此,我期待与上面相同的行为,但显然,我错了。
func f(s string) {
s = "bar"
}
func main() {
s := "foo"
f(s)
fmt.Println(s)
}
Output: "foo"
Run Code Online (Sandbox Code Playgroud)
字符串发生了什么?当字符串作为参数传递时,似乎正在复制基础数据。
相关问题:当我们不希望我们的函数修改字符串时,出于性能原因是否仍然建议通过指针传递大字符串?