小编And*_*nck的帖子

为什么变长数组不是C++标准的一部分?

在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.

显然在C99中,以下语法有效:

void foo(int n) {
    int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

这似乎是一个非常有用的功能.有没有关于将它添加到C++标准的讨论,如果是这样,为什么它被省略?

一些潜在的原因:

  • 毛茸茸的编译器供应商实现
  • 与标准的其他部分不兼容
  • 可以使用其他C++构造模拟功能

C++标准规定数组大小必须是常量表达式(8.3.4.1).

是的,当然我意识到在玩具示例中可以使用std::vector<int> values(m);,但这会从堆中分配内存而不是堆栈.如果我想要一个多维数组,如:

void foo(int x, int y, int z) {
    int values[x][y][z]; // Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)

vector版本变得很笨拙:

void foo(int x, int y, int z) {
    vector< vector< vector<int> > > values( /* Really painful expression here. */);
}
Run Code Online (Sandbox Code Playgroud)

切片,行和列也可能遍布整个内存.

看一下comp.std.c++这个问题的讨论很明显,这个问题在争论的两个方面都有一些非常重要的名字引起争议.毫无疑问,a std::vector总是更好的解决方案.

c++ arrays standards variable-length variable-length-array

311
推荐指数
7
解决办法
14万
查看次数

使用std :: stringstream等效%02d?

我想输出一个std::stringstream等价格为printf's 的整数%02d.是否有更简单的方法来实现这一点:

std::stringstream stream;
stream.setfill('0');
stream.setw(2);
stream << value;
Run Code Online (Sandbox Code Playgroud)

是否有可能将某种格式标志流式传输给stringstream类似(伪代码)的东西:

stream << flags("%02d") << value;
Run Code Online (Sandbox Code Playgroud)

c++ formatting stringstream

58
推荐指数
4
解决办法
7万
查看次数

如果我不在笔对象上调用Dispose会发生什么?

如果我不调用此代码段中Disposepen对象会发生什么?

private void panel_Paint(object sender, PaintEventArgs e)
{
    var pen = Pen(Color.White, 1);
    //Do some drawing
}
Run Code Online (Sandbox Code Playgroud)

c# dispose winforms

37
推荐指数
3
解决办法
1万
查看次数

使用C++进行简单的字符串解析

我已经使用C++很长一段时间了但是scanf当我必须解析简单的文本文件时,我倾向于依赖它.例如,给定这样的配置(也假设字段的顺序可能不同):

foo: [3 4 5]
baz: 3.0
Run Code Online (Sandbox Code Playgroud)

我会写一些类似的东西:

char line[SOME_SIZE];
while (fgets(line, SOME_SIZE, file)) {
    int x, y, z;
    if (3 == sscanf(line, "foo: [%d %d %d]", &x, &y, &z)) {
        continue;
    }
    float w;
    if (1 == sscanf(line, "baz: %f", &w)) {
        continue;
    }
}
Run Code Online (Sandbox Code Playgroud)

在C++中实现这一目的最简洁的方法是什么?每当我尝试时,我最终会得到很多脚手架代码.

c++

33
推荐指数
3
解决办法
5万
查看次数

只能使QTreeWidgetItem的一列可编辑

我有QTreeWidgetItem两列数据,有没有办法让第二列可编辑?当我执行以下操作时:

QTreeWidgetItem* item = new QTreeWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsEditable);
Run Code Online (Sandbox Code Playgroud)

所有列都可以编辑.

c++ flags qt qtreewidgetitem

26
推荐指数
5
解决办法
3万
查看次数

IndexOf谓词?

我想找到一个加工某个谓词的列表中元素的索引,有没有更好的方法来做到:

var index = list.IndexOf(list.Find(predicate));
Run Code Online (Sandbox Code Playgroud)

c#

26
推荐指数
1
解决办法
4552
查看次数

C#迭代器中的递归

是否可以在迭代器实现中使用递归System.Collections.IEnumerable?我有一个大致像这样声明的树结构:

public class Node
{
    public Node Sibling;
    public Node Child;
}
Run Code Online (Sandbox Code Playgroud)

我想迭代树中的节点.我想做这样的事情(伪代码,我猜这不会编译):

public class NodeIterator : System.Collections.IEnumerable
{
    Node m_root;

    public System.Collections.IEnumerator GetEnumerator()
    {
        recursiveYield(m_root);
    }

    System.Collections.IEnumeraton recursiveYield(Node node)
    {
        yield return node;
        if (node.Child)
        {
            recursiveYield(node.Child);
        }
        if (node.Sibling)
        {
            recursiveYield(node.Sibling);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这有点可能吗?我意识到这可以通过函数中的Nodedeque 使用decurs 来解决GetEnumerator.

c# iterator

14
推荐指数
1
解决办法
5029
查看次数

使用LINQ连接列表

是否有可能以一种不可怕的慢速方式将a 连接List<List<T>>到一个List<T>操作中,即:

List<List<int>> listOfLists = new List<List<int>>();
List<int> concatenatedList = listOfLists.Something...
Run Code Online (Sandbox Code Playgroud)

c#

13
推荐指数
1
解决办法
6624
查看次数

浮动添加提升到双倍?

今天早上我有一个小型的WTF时刻.WTF可以概括为:

float x = 0.2f;
float y = 0.1f;
float z = x + y;
assert(z == x + y); //This assert is triggered! (Atleast with visual studio 2008)
Run Code Online (Sandbox Code Playgroud)

原因似乎是表达式x + y被提升为double并与之中的截断版本进行比较z.(如果我更改zdouble断言未触发).

我可以看到,出于精确原因,在将结果转换为单精度之前,以双精度执行所有浮点算术是有意义的.我在标准中找到了以下段落(我想我已经知道了,但在这种情况下不是这样):

4.6.1. "类型的右值float可以转换为类型的右值double.值不变"

我的问题是,x + y保证会被提升为双倍,还是由编译人员自行决定?

更新:由于许多人声称不应该使用==浮点数,我只是想说在我正在使用的特定情况下,确切的比较是合理的.

浮点比较棘手的,这里有一个关于这个主题的有趣链接,我认为还没有提到.

c++ floating-point double

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

带约束的矩形包装

我想打包一组矩形(例子):

在此输入图像描述

因此总高度尽可能低,矩形必须在它们开始的同一列中结束. 矩形允许彼此"移动"以达到最终状态,只要它们不' t在末尾相交.

我们当前的算法是处理从最大高度到最小高度的矩形,并将它们放在可用的最低y位置.有更优化的算法吗?

编辑:我不一定需要最优解决方案,任何生成比当前解决方案更好的解决方案的算法都很有趣.此外,矩形的数量约为50.

algorithm optimization packing mathematical-optimization

12
推荐指数
1
解决办法
1728
查看次数