我知道最好equals使用==运算符调用该方法(请参阅此问题).我希望两个字符串比较相等,如果它们都是null或者它们代表相同的字符串.不幸的是,如果字符串是equals,NPE则该方法将抛出null.我的代码目前是:
boolean equals(String s1, String s2) {
if (s1 == null && s2 == null) {
return true;
}
if (s1 == null || s2 == null) {
return false;
}
return s1.equals(s2);
}
Run Code Online (Sandbox Code Playgroud)
这是不优雅的.执行此测试的正确方法是什么?
我想k在n没有选择相同数字两次的情况下随机选择均匀的元素.这有两个简单的方法.
n可能性.将它们洗牌(你不需要通过执行Fisher Yates的第一步来改变它们的
所有n数字).选择第一个.这种方法需要时间(假设分配一个大小的数组需要
时间)和空间.如果相对于非常小,这是一个问题.kkkO(k)nO(1)O(n)kn[0, n-1].当元素在集合中时,然后选择一个新数字.这种方法占用O(k)空间.运行时分析要复杂一些.如果k = theta(n)那时运行时间是
O(k*lg(k))=O(n*lg(n))因为它是优惠券收集器的问题.如果k相对较小n则需要稍微多于O(k)因为选择相同数字两次的概率(尽管很低).这在空间方面优于上述解决方案,但在运行时方面更差.我的问题:
是否有O(k)时间,O(k)空间算法为所有k和n?
我正在编写一个函数,它接收一个指向比较函数的指针和一个数组,MyStructs并且应该根据比较函数对数组进行排序:
void myStructSort(
struct MyStruct *arr,
int size,
int (*comp)(const struct MyStruct *, const struct MyStruct *)) {
qsort(arr, size, sizeof(struct MyStruct), comp);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不会编译,因为qsort期望比较器接收void *参数而不是const struct MyStruct *.我想到了几个不好的解决方案,并想知道正确的解决方案是什么.
选项1
铸造comp到int (*)(const void *, const void*).这编译但是未定义的行为(参见这个问题).
选项2
创建一个全局变量int (*global_comp)(const struct MyStruct *, const struct MyStruct *),并设置global_comp=comp里面myStructSort.然后创建一个函数:
int delegatingComp(const void *a, const void *b) {
return globalComp((const struct MyStruct *)a, (const …Run Code Online (Sandbox Code Playgroud) 我有一个类模板,我用它来获取变量的大小:
template <class T>
class Size
{
unsigned int operator() (T) {return sizeof(T);}
};
Run Code Online (Sandbox Code Playgroud)
这工作正常,但对于字符串我想使用strlen而不是sizeof:
template <>
class Size<char *>
{
unsigned int operator() (char *str) {return strlen(str);}
};
Run Code Online (Sandbox Code Playgroud)
问题是当我使用const char*创建一个大小的实例时,它会进入非专业化版本.我想知道是否有办法在模板专业化中捕获char*的const和非const版本?谢谢.
我的代码看起来像这样:
List<String> filterList(List<String> list, String regex) {
List<String> result = new ArrayList<String>();
for (String entry : list) {
if (entry.matches(regex)) {
result.add(entry);
}
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
它返回一个列表,其中只包含与之匹配的条目regex.我想知道是否有这样的内置功能:
List<String> filterList(List<String> list, String regex) {
List<String> result = new ArrayList<String>();
result.addAll(list, regex);
return result;
}
Run Code Online (Sandbox Code Playgroud) 我有一个带有布尔模板参数的类.
template<bool b>
class Foo {
void doFoo();
};
Run Code Online (Sandbox Code Playgroud)
我想doFoo根据价值做不同的事情b.
天真我能写
选项1
template<bool b> void Foo<b>::doFoo() {
if (b) cout << "hello";
else cout << "goodbye";
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎效率低下,因为我必须在if每次调用函数时执行一次,尽管在编译时应该知道正确的分支.我可以通过模板专业化解决这个问题:
选项2
template<> void Foo<true>::doFoo() { cout << "hello"; }
template<> void Foo<false>::doFoo() { cout << "goodbye"; }
Run Code Online (Sandbox Code Playgroud)
这样我在运行时就没有执行任何条件.这个解决方案有点复杂(特别是因为在我的实际代码中,类有几个模板参数,你不能部分地专门化函数,所以我需要将函数包装在一个类中).
我的问题是,编译器是否足够聪明,知道不执行条件选项1,因为它总是以相同的方式执行,还是需要编写特化?如果编译器足够智能,我很乐意知道这是依赖于编译器还是我可以依赖的语言功能?
在DLL中AI有一个模板单例:
template <class T>
class Singleton
{
public:
static T &instance()
{
static T _instance;
return _instance;
}
private:
//All constructors are here
};
Run Code Online (Sandbox Code Playgroud)
在Dll BI中定义一个类Logger.Dlls C,D和E使用Logger,它的访问方式如下:
Singleton<Logger>::instance();
Run Code Online (Sandbox Code Playgroud)
问题是每个dll都实例化它自己的副本
Singleton<Logger>.
Run Code Online (Sandbox Code Playgroud)
而不是使用相同的单例实例.我知道这个问题的解决方案是使用extern模板.这就是d,C,D和E必须包含的内容
extern template class Singleton<Logger>;
Run Code Online (Sandbox Code Playgroud)
和dll B必须包括:
template class Singleton<Logger>;
Run Code Online (Sandbox Code Playgroud)
这仍然会导致创建多个模板实例.我尝试将extern放在所有的dll中但它仍然无法工作我尝试从所有dll中移除extern并且它仍然无法工作.这不是实现模板单例的标准方法吗?这样做的正确方法是什么?
我想用当前日期和时间设置datetime-local输入的值.现在我有一个丑陋的解决方案,涉及切割前17个字符.此外,它以GMT而不是当地时间设置时间.我的代码如下:
<input type="datetime-local" name="name" id="1234">
<script type="text/javascript">
var d = new Date();
var elem = document.getElementById("1234");
elem.value = d.toISOString().slice(0,16);
</script>
Run Code Online (Sandbox Code Playgroud)
这个代码有两个问题:
Date为合法值而无需手动切片?DD/MM/YYYY, hh:mm(例如,05/11/2015, 14:10它是13:10GMT但我在GMT + 1,所以我想显示14:10).目前显示的是05/11/2015, 01:10 PM.我想删除PM并在当地时间显示.这可能是一个XY问题,所以如果我完全错误并且有更好的方法在html中显示日期时间选择器,我会很高兴听到.
我有两个向量。我想遍历两者的所有元素并做一些事情(比如打印出来)。所以我可以写一些类似的东西:
vector<int> vec_a{1, 2, 3}, vec_b{4, 5, 6, 7};
for (auto a : vec_a) {
cout << a;
}
for (auto b : vec_b) {
cout << b;
}
Run Code Online (Sandbox Code Playgroud)
这有很多重复。我可以做这样的事情:
for (const auto& vec : {vec_a, vec_b}) {
for (auto elem : vec) {
cout << elem;
}
}
Run Code Online (Sandbox Code Playgroud)
但这增加了一个额外的for(这还不错,但我想知道是否有更好的东西。大致如下:
for (auto elem : concat(vec_a, vec_b)) {
cout << elem;
}
Run Code Online (Sandbox Code Playgroud)
我知道我可以只连接向量(一个连接两个 std::vectors)但这种语法更笨拙(特别是因为我实际上有 4 个向量)。
我希望输出是:
1 2 3 4 5 6 7
我rand()用来生成0或1(rand() % 2).我正在使用当前时间(srand(time(NULL)))播种它.
经过多次调试,我意识到rand()永远不会连续返回偶数(奇数)16次或更多次.
这是一个已知的问题?C有更好的PRNG吗?
我使用Visual Studio 2010在Windows 7上运行.