我正在Stroustrup的新书"使用C++编程原理和实践"中进行练习,并且想知道SO上是否有人做过这些并愿意分享这些知识?特别是关于在第6章和第7章中开发的计算器.例如关于添加的计算器!运营商和sqrt(),pow()等我已经完成了这些,但我不知道我所拥有的解决方案是否是"好"的做事方式,并且Bjarne网站上没有已发布的解决方案.我想知道我是否走上正轨.也许我们可以为练习制作一个维基?
基本上我有一个令牌解析器.它从cin一次读取一个字符.它意味着标记像5*3 + 1这样的表达式,它的效果非常好.其中一个练习是添加一个sqrt()函数.所以我修改了令牌化代码以检测"sqrt("然后返回表示sqrt的Token对象.在这种情况下,我使用char的'.这是其他人会怎么做的?如果我需要实现sin()怎么办?案件陈述会变得混乱.
char ch;
cin >> ch; // Note that >> skips whitespace (space, newline, tab, etc.)
switch (ch) {
case ';': // For "print"
case 'q': // For "quit"
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
case '!':
return Token(ch); // Let each character represent itself
case '.':
case '0': case '1': case '2': case '3': case '4':
case '5': case '6': case '7': case '8': case '9':
{
cin.putback(ch); …Run Code Online (Sandbox Code Playgroud) 例如,如果输入字符串是helloworld,我希望输出如下:
do
he
we
low
hell
hold
roll
well
word
hello
lower
world
...
Run Code Online (Sandbox Code Playgroud)
一直到最长的单词,这是一个helloworld子字符串的字谜.就像Scrabble一样.输入字符串可以是任意长度,但很少超过16个字符.
我已经完成了搜索并想出了像trie这样的结构,但我仍然不确定如何实际执行此操作.
我正在尝试使用std :: for_each来输出向量的内容,这些向量可能包含不同的类型.所以我写了一个通用输出函数,如下所示:
template<typename T> void output(const T& val)
{
cout << val << endl;
}
Run Code Online (Sandbox Code Playgroud)
我想用它:
std::for_each(vec_out.begin(), vec_out.end(), output);
Run Code Online (Sandbox Code Playgroud)
但是编译器在for_each语句中抱怨"无法推断出模板参数".还抱怨"函数模板不能成为另一个函数模板的参数".
这不可能吗?我原以为编译器会知道vec_out(它的向量)的类型,所以应该实例化函数"output(const double&val)"?
如果这不起作用,如何在不编写手动循环的情况下获得类似的STL功能?
我对C++很新,还在学习绳索:-)
得到答案后编辑
这里有一些很好的答案 我喜欢Josh,因为它非常聪明并且使用C++.但是我决定接受Dave的答案,因为它的简单性和递归性.我对它们进行了测试,它们都产生了相同的正确结果(尽管顺序不同).再次感谢大家.
假设我有一个字符串s chars s [0]:s [N]并且每个char s [i] <= s [i + 1]例如字符串
aaacdddghzz
Run Code Online (Sandbox Code Playgroud)
我想生成子串的所有组合,同时保持字符之间的相同关系.
所以例如我会得到
a
aa
aaa
ad
aad
aaad
add
aadd
aaadd
addd
aaddd
aaaddd
d
dd
ddd
.
.
.
ac
aac
.
.
.
acdddghzz
aacdddghzz
aaacdddghzz
Run Code Online (Sandbox Code Playgroud)
但不是
ca
hdz
...etc
Run Code Online (Sandbox Code Playgroud)
现在我知道如何计算出有多少种组合.您可以创建字符串中字母频率的直方图.所以在上面的例子中就是这样
对于字符串aaacdddghzz
a=3
d=3
c=1
g=1
h=1
z=2
Run Code Online (Sandbox Code Playgroud)
而公式是(a+1)(c+1)(d+1)(g+1)(h+1)(z+1) = 4*4*2*2*2*3 = 384.有384个子串保持s [i] <= s [i + 1]的关系.
所以问题是如何递归生成这些384子串?实际上,迭代方法也同样好,也许更好,因为具有许多唯一字符的大字符串可能导致堆栈溢出.这听起来像是作业,但事实并非如此.我想出这样的算法是没用的.我使用C++但伪代码会很好.
在Excel中,您可以双击列标题(实际上是两列标题之间的行),左侧的列将在宽度上展开以适合最长文本的长度.有没有办法以编程方式执行此操作?我使用Excel 2010与C#和.Net框架.
I'm trying to understand the meaning of constexpr when applied to functions. In the example below the program compiles and runs but I don't understand how the function sum(int n) can be deduced at compile time as n is not known until run time. I'm using VS 2017 with latest updates.
The program compiles whether constexpr is included or not.
#include <iostream>
constexpr int sum(int n)
{
return (n <= 0) ? 0 : n + sum(n-1);
}
int main() …Run Code Online (Sandbox Code Playgroud) 嗯,实际上从水平旋转-90度就是我的意思.我需要这样做,因为标题的文本很长但单元格值很短,我想在屏幕上放置很多列.是否可以轻松完成此操作或者我是否需要首先了解资源和模板?我不介意"黑客"解决方案!
当我运行这个程序时,我在包含fn(3,4)的行上得到两个错误
参数1:无法从'int'转换为T.
参数2:无法从'int'转换为T.
我认为类型T将是int,由lambda指定.但如果是这样,为什么转换错误呢?我误会了什么吗?
class Program
{
static void DoStuff<T>(Func<T, T, T> fn)
{
Console.WriteLine(fn(3, 4));
}
static void Main()
{
DoStuff((int x, int y) => x + y);
}
}
Run Code Online (Sandbox Code Playgroud)
如果我更改参数以接受int作为参数,这是有效的:
class Program
{
static void DoStuff<T>(T x, T y, Func<T, T, T> fn)
{
Console.WriteLine(fn(x, y));
}
static void Main()
{
DoStuff(3, 4, (int x, int y) => x + y);
}
}
Run Code Online (Sandbox Code Playgroud)
我来自C++背景,因此试图了解C#中哪些有效,哪些无效
我想获得总目录大小,包括所有子目录和文件。我认为有两种方法可以做到这一点,第一种是获取所有文件的所有文件属性(.NET 中的 FileInfo)的列表,然后将所有 Length 属性相加,如下所示:
listOfFileInfos |> List.sumBy (fun f -> f.Length)
Run Code Online (Sandbox Code Playgroud)
另一种方法是在我们遍历目录结构时将每个文件的文件大小添加到累加器中。所以我们不会建立一个很大的列表,我们只是在我们进行时添加到总数中。不过,我不太确定如何在 F# 中执行此操作!
哪种方式更地道?第一个对我来说看起来更容易,但我只是函数式编程的初学者。