在过去的几年里,我并没有非常使用过C语言.当我今天读到这个问题时,我遇到了一些我不熟悉的C语法.
显然在C99中,以下语法有效:
void foo(int n) {
int values[n]; //Declare a variable length array
}
Run Code Online (Sandbox Code Playgroud)
这似乎是一个非常有用的功能.有没有关于将它添加到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总是更好的解决方案.
我想输出一个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) 如果我不调用此代码段中Dispose的pen对象会发生什么?
private void panel_Paint(object sender, PaintEventArgs e)
{
var pen = Pen(Color.White, 1);
//Do some drawing
}
Run Code Online (Sandbox Code Playgroud) 我已经使用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++中实现这一目的最简洁的方法是什么?每当我尝试时,我最终会得到很多脚手架代码.
我有QTreeWidgetItem两列数据,有没有办法让第二列可编辑?当我执行以下操作时:
QTreeWidgetItem* item = new QTreeWidgetItem();
item->setFlags(item->flags() | Qt::ItemIsEditable);
Run Code Online (Sandbox Code Playgroud)
所有列都可以编辑.
我想找到一个加工某个谓词的列表中元素的索引,有没有更好的方法来做到:
var index = list.IndexOf(list.Find(predicate));
Run Code Online (Sandbox Code Playgroud)
?
是否可以在迭代器实现中使用递归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.
是否有可能以一种不可怕的慢速方式将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)
?
今天早上我有一个小型的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.(如果我更改z为double断言未触发).
我可以看到,出于精确原因,在将结果转换为单精度之前,以双精度执行所有浮点算术是有意义的.我在标准中找到了以下段落(我想我已经知道了,但在这种情况下不是这样):
4.6.1.
"类型的右值float可以转换为类型的右值double.值不变"
我的问题是,x + y保证会被提升为双倍,还是由编译人员自行决定?
更新:由于许多人声称不应该使用==浮点数,我只是想说在我正在使用的特定情况下,确切的比较是合理的.
浮点比较是棘手的,这里有一个关于这个主题的有趣链接,我认为还没有提到.
我想打包一组矩形(例子):

因此总高度尽可能低,矩形必须在它们开始的同一列中结束. 矩形允许彼此"移动"以达到最终状态,只要它们不' t在末尾相交.
我们当前的算法是处理从最大高度到最小高度的矩形,并将它们放在可用的最低y位置.有更优化的算法吗?
编辑:我不一定需要最优解决方案,任何生成比当前解决方案更好的解决方案的算法都很有趣.此外,矩形的数量约为50.
c++ ×5
c# ×4
algorithm ×1
arrays ×1
dispose ×1
double ×1
flags ×1
formatting ×1
iterator ×1
optimization ×1
packing ×1
qt ×1
standards ×1
stringstream ×1
winforms ×1