小编Ben*_*ler的帖子

当两者都可以为空时如何比较两个字符串?

我知道最好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)

这是不优雅的.执行此测试的正确方法是什么?

java equality equals

45
推荐指数
2
解决办法
9582
查看次数

从n中选择k

我想kn没有选择相同数字两次的情况下随机选择均匀的元素.这有两个简单的方法.

  1. 列出所有n可能性.将它们洗牌(你不需要通过执行Fisher Yates的第一步来改变它们的 所有n数字).选择第一个.这种方法需要时间(假设分配一个大小的数组需要 时间)和空间.如果相对于非常小,这是一个问题.kkkO(k)nO(1)O(n)kn
  2. 存储一组看到的元素.从中随机选择一个数字[0, n-1].当元素在集合中时,然后选择一个新数字.这种方法占用O(k)空间.运行时分析要复杂一些.如果k = theta(n)那时运行时间是 O(k*lg(k))=O(n*lg(n))因为它是优惠券收集器的问题.如果k相对较小n则需要稍微多于O(k)因为选择相同数字两次的概率(尽管很低).这在空间方面优于上述解决方案,但在运行时方面更差.

我的问题:

是否有O(k)时间,O(k)空间算法为所有kn

algorithm shuffle

21
推荐指数
1
解决办法
1774
查看次数

转换函数指针

我正在编写一个函数,它接收一个指向比较函数的指针和一个数组,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

铸造compint (*)(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)

c function-pointers qsort

15
推荐指数
2
解决办法
1676
查看次数

Const和非const模板专业化

我有一个类模板,我用它来获取变量的大小:

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版本?谢谢.

c++ templates

12
推荐指数
2
解决办法
9439
查看次数

Java - 由Regex过滤列表条目

我的代码看起来像这样:

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)

java regex collections

12
推荐指数
2
解决办法
2万
查看次数

模板专业化与编译器优化

我有一个带有布尔模板参数的类.

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,因为它总是以相同的方式执行,还是需要编写特化?如果编译器足够智能,我很乐意知道这是依赖于编译器还是我可以依赖的语言功能?

c++ templates

12
推荐指数
2
解决办法
844
查看次数

一个DLL中的C++模板单例

在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并且它仍然无法工作.这不是实现模板单例的标准方法吗?这样做的正确方法是什么?

c++ singleton templates

11
推荐指数
3
解决办法
3980
查看次数

从Date设置datetime-local的值

我想用当前日期和时间设置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)

这个代码有两个问题:

  1. 有没有办法从a转换Date为合法值而无需手动切片?
  2. 我希望字符串显示在datetime-local中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中显示日期时间选择器,我会很高兴听到.

html javascript datetime

9
推荐指数
4
解决办法
8316
查看次数

如何按顺序迭代两个容器

我有两个向量。我想遍历两者的所有元素并做一些事情(比如打印出来)。所以我可以写一些类似的东西:

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

c++

9
推荐指数
1
解决办法
175
查看次数

C rand()缺乏随机性

rand()用来生成0或1(rand() % 2).我正在使用当前时间(srand(time(NULL)))播种它.

经过多次调试,我意识到rand()永远不会连续返回偶数(奇数)16次或更多次.

这是一个已知的问题?C有更好的PRNG吗?

我使用Visual Studio 2010在Windows 7上运行.

c random

8
推荐指数
1
解决办法
3059
查看次数