小编Fra*_*fer的帖子

是否有更好的替代std :: remove_if来从向量中删除元素?

从一个std::vector容器或其他容器中删除具有特定属性的元素的任务适用于功能样式实现:为什么要烦扰循环,内存释放和正确移动数据?

但是,在C++中执行此操作的标准方法似乎是以下习惯用法:

std::vector<int> ints;
...
ints.erase(
    std::remove_if(ints.begin(), 
                   ints.end(),
                   [](int x){return x < 0;}),
    ints.end());
Run Code Online (Sandbox Code Playgroud)

此示例从整数向量中删除小于零的所有元素.

我发现它不仅丑陋而且容易错误使用.很明显,std::remove_if不能改变向量的大小(正如其名称所暗示的那样)因为它只传递了迭代器.但是许多开发人员,包括我自己,在开始时都没有这样做.

那么有更安全,更有希望实现这一目标的方式吗?如果没有,为什么?

c++ stl erase-remove-idiom c++11 c++17

26
推荐指数
2
解决办法
9775
查看次数

围绕返回值的括号 - 为什么?

我经常看到这样的代码(C,C++,有时候是Java):

return (value);
Run Code Online (Sandbox Code Playgroud)

我认为这些括号没有任何好处.所以我的问题是,假设程序员return是某种以返回值作为参数的函数,或者这些括号是否有意义?

我知道这里已经提出了类似的问题,但这只与ANSI C有关.我想知道是否有特定于C++或Java的方面尚未得到解答.

c c++ java

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

如何确定一个类是否是不可变的

在给我的问题具体化之前,让我提供一些背景知识:我的主要编程语言是C++和Java.使用C++时,我发现应用const正确性很重要,即声明这样的函数:

A::DoSomething( const B& arg ); // guarantees that arg is not modified
A::DoSomething() const; // guarantees that the object of type A is not modified
A::DoSomething( const B& arg ) const; // both of the above
Run Code Online (Sandbox Code Playgroud)

事实上,我经常希望这const是默认值,并且必须以某种方式标记被修改的对象.

我使用的主要原因const是:

  • 与其他开发人员的沟通:它使代码更具表现力.
  • 与编译器的通信:它有助于在编译时查找问题,有时可以进行其他优化.

众所周知,Java没有const关键字(你不能做上面的事情final),这个事实在这里已经讨论过,例如参见:Java中的const(C++)的等价物.

通常提出的Java替代方法是使您的类不可变.虽然这不是完全替代,const因为它适用于每个类而不是每个使用类的上下文,但在大多数情况下它对我来说都可以正常工作.

但是不可变类有一个大问题:不可变性并不明显.要知道一个类是否真的是不可变的,据我所知,你基本上必须检查完整的源代码.任何方法都可以有一个后门,通过它可以修改对象.

那么有更简单的方法来检查不变性吗?或者是否有任何最佳实践以某种方式标记一个类是不可变的?

注意:我知道这两种语言都提供了绕过constness或immutability的"邪恶伎俩":C++ const_cast和Java都有反思.但是对于我的问题的背景,我们假设这些都没有被使用.

java oop immutability

11
推荐指数
1
解决办法
4269
查看次数

数字类型之间的C++转换

我知道C++中的不同的转换操作符已经在这里讨论了很多次,但我的问题是关于数字类型之间的转换,而不是C风格和C++风格操作符之间的一般差异.我认为这是一个完全不同的主题,而不是在类层次结构中进行投

假设我想将一个int i转换为double,我有一些选项

static_cast<double>(i)
(double) i
double(i)
Run Code Online (Sandbox Code Playgroud)

就个人而言,在这种情况下,我更喜欢第3行中类似于构造函数的样式,因为我想表达这不是演员类型类型,我当然会使用static_castdynamic_cast.

除了在文本编辑器中搜索时难以找到这种类型的演员表,我选择的任何缺点都有吗?

c++ casting

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

C#枚举和泛型

为什么编译器拒绝此代码并出现以下错误?(我用VS 2017C# 7.3启用。)

CS0019运算符'=='不能应用于类型'T'和'T'的操作数

public class GenericTest<T> where T : Enum
{
    public bool Compare(T a, T b)
    {
        return a == b;
    }
}
Run Code Online (Sandbox Code Playgroud)

没有泛型的版本当然是完全有效的。

public enum A { ONE, TWO, THREE };

public class Test
{
    public bool Compare(A a, A b)
    {
        return a == b;
    }
}
Run Code Online (Sandbox Code Playgroud)

c# generics enums

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

无参函数——它们在软件设计中的作用是什么?

罗伯特·马丁(Robert Martin)在他的《干净代码》一书中指出,函数参数的理想数量是零。大多数人都会同意太多的函数参数会导致很多问题。但据我所知,零参数的函数至少属于以下类别之一:

  1. 该函数很简单,并且始终返回相同的值。
  2. 该函数缺乏引用透明度,其返回值取决于外部可变状态。
  3. 该函数的目的是它的副作用。

现在,类型 (1) 的函数并不是真正有用,而出于众所周知的原因,应避免使用 (2) 和 (3)。

我知道我提到的书是关于 OOP 的,因此函数通常属于一个对象,并获取作为隐式参数传递的对象引用。但访问对象属性仍然意味着 (2) 或 (3)。

那么我错过了什么?

如果你回答这个问题,请不要只是表达你的观点,而要提供合理的论据或具体的例子。不然很可能会关门。

language-agnostic oop functional-programming

7
推荐指数
1
解决办法
714
查看次数

链接列表,数组和硬件内存缓存

虽然之前已经提出了关于链表和数组的问题,但答案大多归结为我们大多数人在某些时候可能已经学到的东西:

  • 列表擅长插入和删除
  • 数组很擅长随机访问

现在像Bjarne Stroustrup这样受人尊敬的人认为,数组实际上总是优于链表,因为它们更好地利用了现代硬件中实现的缓存架构.他还指出,阵列的性能优势随着它们的大小而增加.

虽然我基本上理解他的论点并同意他,但我想知道当数组的大小远大于缓存大小时,这是否仍然是正确的.我会说,性能真的很重要.

总结一下:在大多数情况下,数组仍然比列表表现更好,即使它们的大小比缓存大小大得多,并且大部分操作都是插入或删除吗?如果是,如何解释?

language-agnostic arrays performance linked-list cpu-cache

6
推荐指数
1
解决办法
780
查看次数