我有一个模板,它采用类型的非类型模板参数unsigned long long.实例化这个模板很快就会变得混乱,因为它涉及很多数字.事实上,理想的我会用二进制表示使事情变得更糟:有多达64个0和1字符.如何创建视觉上可识别的参数.例如:
template <unsigned long long>
struct use_mask {
// for this question it doesn't matter what the template actually does
};
int main() {
use_mask<0b1001001010010010> unreadable; // OK, there are no binary literals
use_mask<0b1001,0010,1001,0010> more_readable; // ... nor are there digit separators
}
Run Code Online (Sandbox Code Playgroud)
有没有办法近似后一种符号,可能在值之前和之后有一些东西?
KMP和Z算法是用于字符串搜索的众所周知的算法,
KMP算法处理通过KMP失败函数查找模式,该函数定义为(pat是搜索模式)
lps [i] = pat [0..i]的最长适当前缀,也是pat [0..i]的后缀。
例如,用于string "abcab"这将是[0, 0, 0, 1, 2]
其中,Z算法使用z函数定义为:
给定长度为n的字符串S,Z算法将生成一个数组Z,其中Z [i]是从pat [i]开始的最长子字符串的长度,pat [i]也是pat的前缀。
现在的问题是我们可以Z通过使用KMP算法来实现功能吗?我要搜索的是lps数组中的一些修改,这些修改导致与数组相同的结果Z[i]。
在C++中解析由流中的整数序列组成的文本很容易:只需解码它们即可.当以某种方式接收数据并且在程序内容易获得时,例如,接收base64编码的文本(解码不是问题),情况有点不同.数据位于程序内的缓冲区中,只需要解码,而不是读取.当然,std::istringstream可以使用:
std::vector<int> parse_text(char* begin, char* end) {
std::istringstream in(std::string(begin, end));
return std::vector<int>(std::istream_iterator<int>(in),
std::istream_iterator<int>());
}
Run Code Online (Sandbox Code Playgroud)
由于接收了许多这些缓冲区并且它们可能相当大,因此希望不复制字符数组的实际内容,并且理想地,还避免为每个缓冲区创建流.因此,问题变为:
给定chars 的缓冲区包含一系列(空格分离;处理其他分隔符很容易完成,例如,使用合适的操纵器)整数如何在不复制序列的情况下进行解码,如果可能的话,不创建偶数std::istream?
当我试图从现有程序中学习时,我无法理解以下两行代码尝试做什么?
for(i=0;0==(x&1);++i)x>>=1;
if(0==(x-=y)) return y<<i;
Run Code Online (Sandbox Code Playgroud)
任何解释将不胜感激.
将对象传递给函数时,可以选择按值或按 传递参数const&。特别是当对象的创建可能很昂贵并且它在内部发生变异或用于初始化另一个对象时,建议按值传递对象。例如:
class Foo {
std::vector<std::string> d_strings;
public:
Foo(std::vector<std::string> strings): d_strings(std::move(strings)) {}
// ...
};
Run Code Online (Sandbox Code Playgroud)
传统的方法是将strings参数声明为std::vector<std::string> const&并复制参数。上面构造函数的 value 参数也需要复制!
为什么通过值传递而不是传递更可取const&?
对于计算密集型问题,我想限制程序花费的CPU时间:如果程序在给定的时间内没有找到解决方案,我希望程序终止.而不是让程序永远寻找解决方案,它应该终止,如果没有找到.如果平台很重要,这适用于UNIX.怎么能实现这一目标?
我有一些代码打印一些小数字(实际上是几年),请求是将数字打印为罗马数字,而不是使用通常的印度 - 阿拉伯数字:
int main() {
// do something to make all integers appear in Roman numerals
std::cout << "In the year " << 2013 << " the following output was generated:\n";
// ...
}
Run Code Online (Sandbox Code Playgroud)
将ints 格式化为罗马数字可以做些什么?
我希望得到一个数字std::string但不使用循环(我自己;我正在调用的代码使用的是什么,我不介意).请求的另一种观点是:从字符串中删除所有非数字,只留下数字.我知道我可以使用以下代码查找字符串中的所有数字:
std::string get_digits(std::string input) {
std::string::size_type next_digit(0u);
for (std::string::size_type pos(0u);
input.npos != (pos = input.find_first_of("0123456789"));
++pos) {
input[next_digit++] = input[pos];
}
input.resize(next_digit);
return input;
}
Run Code Online (Sandbox Code Playgroud)
但是,此函数使用循环.std::string不提供功能find_all()或东西!理想情况下,字符串就地移动(上面的代码移动它,但很容易更改为参考).
当有多种选择时,我会保证发布不同方法在某些冗长文本上有多好的分析结果.
这个简单的程序应该清楚地打印出来
#include <iostream>
int main()
{
// the condition below is ignored! \\
if (false)
std::cout << "hello, world\n";
}
Run Code Online (Sandbox Code Playgroud)
然而,编译它打印hello, world(后面跟一个换行符)我尝试的所有编译器(gcc,clang,Sun CC,xlC).删除注释时,程序按预期运行,即程序不打印任何内容.
为什么条件(总是false)被注释存在而被忽略?
std::istream(嗯,真的std::basic_istream)上的各种未格式化的输入函数,如read()、readsome()、getline()、ignore()都返回一个流。处理结果时,了解实际读取了多少个字符通常很重要。依赖字符串中的空字符显然不适用于二进制文件,或者ignore()甚至不涉及任何字符串,即strlen()完全不可能。
如何确定最后一次使用std::istream或更一般地使用 的无格式输入操作读取的字符数?std::basic_istream
The header <algorithm> contains a version of std::transform() taking a two input sequences, an output sequence, and a binary function as parameters, e.g.:
#include <algorithm>
#include <iostream>
#include <iterator>
#include <vector>
int main()
{
std::vector<int> v0{1, 2, 3};
std::vector<int> v1{4, 5, 6};
std::vector<int> result;
std::transform(v0.begin(), v0.end(), v1.begin(), std::back_inserter(result),
[](auto a, auto b){ return a + b; });
std::copy(result.begin(), result.end(),
std::ostream_iterator<int>(std::cout, " "));
std::cout << '\n';
}
Run Code Online (Sandbox Code Playgroud)
C++20 introduced range algoirthms which does include std::ranges::views::transform(R, F) and its implementation std::ranges::views::transform_view. …
不同的C++编译器在不同的时间点实现各种语言功能(例如,参见clang C++ status和gcc c ++ status ;同样适用于其他编译器).在创建C++库时,通常需要支持最新功能以改善用户体验.当支持新功能而不是在任何地方实现的公共子集时,了解编译器支持哪些功能而不必为每个编译器支持一组版本号是有帮助的.
是否有合理标准化的功能测试集可以在编译时用于确定编译器是否支持特定的语言功能?
我试图弄清楚如何在两个值上排序结构的双端队列,而不只是一个.我所拥有的代码就是我所拥有的完美排序arrival,但是如果两个项目相同pid,我希望它们也是pid顺序.我希望我有意义!
例如:
具有pid1和arrival10的a的进程应该在具有pid2和arrival10 的进程之前,即使具有pid1 的进程最初在deque中出现.
struct Process{
int pid;
int burst;
int arrival;
};
int sortOnArrival (Process const &a, Process const &b){
return a.arrival < b.arrival;
}
int main(int argc, char *argv[]){
deque<Process> readyQueue;
// This is just pseudocode, but trust me, it works. :)
fill(readyQueue);
sort(readyQueue.begin(), readyQueue.end(), sortOnArrival);
}
Run Code Online (Sandbox Code Playgroud)