我总是习惯#define
在 cpp 文件开头的某个地方定义幻数。我想把它改成const
数字。(全局变量在 cpp 文件中声明/定义。)这是个好主意吗?我应该将它们放入匿名命名空间吗?我从不#include
在任何地方使用 cpp 文件。
在c ++ 17中你可以做到
std::array a{ "one", "two", "three" };
Run Code Online (Sandbox Code Playgroud)
得到一个std::array<const char*, 3>
.真棒!
因为数组成员变量必须在类声明中指定它们的大小,所以它不能用作类变量.我想用这些任意长的初始化列表初始化数组和一个或多个constexpr
方法之一创建一个类.我希望唯一的构造函数将初始化列表作为参数.有没有办法做到这一点?
我试图在这样的字符串中使用C++中的反斜杠:
HWND hwnd = FindWindowA(NULL, "C:\Example\App.exe");
Run Code Online (Sandbox Code Playgroud)
所以对于这个例子,我会得到这些错误/警告:"未知转义序列:'\ E'""未知转义序列:'\ A'".因为我需要输入窗口的确切名称,有没有办法避免使用反斜杠或阻止编译器将它们解释为"转义序列"?
我正在尝试解决UVA 417,但无法解决。我见过的所有解决方案都首先生成所有可能的值,将它们存储在映射中,然后搜索以查找所需的字符串。这对我来说似乎很微不足道。难道没有办法数学上解决这个问题吗?
考虑输入“ abc”。如果没有规定每个后续字符都应大于当前字符的条件,则可以通过简单地计算1 * 26 ^ 2 + 2 * 26 ^ 1 + 3 * 26 ^ 0来解决。难道没有办法以类似的方式解决原始问题吗?
我包括在网上找到的现有解决方案的代码:
#include <iostream>
#include <string>
#include <map>
#include <queue>
using namespace std;
map<string, int> M;
void generate_positions(){
queue<string> Q;
for(char c='a';c<='z';c++) Q.push(string(1,c));
string s;
int cont=1;
while(!Q.empty()){
s=Q.front();
Q.pop();
M[s]=cont;
cont++;
if(s.size()==5) continue;
for(char c=s[s.size()-1]+1;c<='z';c++) Q.push(s+c);
}
}
int main(){
generate_positions();
string s;
map<string, int> :: iterator it;
while(cin>>s){
it=M.find(s);
if(it==M.end()) cout<<0<<endl;
else cout<<it->second<<endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Shunting-yard算法,所以我开始研究它.在这样做的同时,我发现了一些我不太了解的有趣文档:
// Current token is a number, push
// it to stack for numbers.
else if(isdigit(tokens[i])){
int val = 0;
// There may be more than one
// digits in number.
while(i < tokens.length() &&
isdigit(tokens[i]))
{
val = (val*10) + (tokens[i]-'0');
i++;
}
values.push(val);
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么在里面while
,变量val
乘以10(val=(val*10)
).有人可以帮助我理解为什么算法必须这样做?
所以我的任务是找到一种方法来并行化这个简单的 C++ 问题。问题是......我真的......真的在并行编程概念上挣扎,不知道该怎么做。应采取的步骤如下:
1) 取一个正整数 N 作为参数
2) 创建一个大小为 N 的整数数组
3) 填充范围 [1,1000] 中的整数
4) 并行查找最大整数和数组的总和
5) 打印最大的整数整数和数组的总和。
在我进入第 4 步之前,这很容易。我不知道如何并行化这段代码。我听说过诸如线程和多线程之类的概念,但我对如何在 C++ 中实现它们的想法几乎为零,并且可以真正使用一些帮助 + 对此的详细解释。我还没有找到一个对我有意义的并行化 C++ 程序的具体示例。
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main(){
cout << "Enter the Size of the Array (N): \n ";
int N;
cin >> N;
int array[N];
int largest_number = 0;
int sum = 0;
srand(time(0));
cout << "Populating Array...\n";
// Filling up the Array with values
for(int …
Run Code Online (Sandbox Code Playgroud) std::optional
可以使用语法来访问其值,类似于普通指针一样。
std::optional<string> some_str;
if (some_str)
(*some_str).c_str();
Run Code Online (Sandbox Code Playgroud)
但它也有两个功能,has_value()
并value()
提供访问其价值和检查,如果该值存在。
std::optional<string> some_str;
if (some_str.has_value())
some_str.value().c_str();
Run Code Online (Sandbox Code Playgroud)
我想知道这两者之间有什么区别?
1.更冗长
2.性能?
3.更好的日志记录和调试?value()
会抛出异常。
我有以下几点:
//a.cpp
inline int f(int x) { return x; }
int g(int x) { return f(x); }
//b.cpp
#include <iostream>
inline int f(int x) { return x + 1; }
extern int g(int);
int main() {
std::cout << g(2) << f(2) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
输出为22
(MSVC和GCC),即a.cpp
f
内联函数而不是内联函数b.cpp
。f
在这种情况下选择功能的标准是什么?
我有一个 C 风格的数组(不一定以 null 结尾)。我想用正则表达式搜索它。我的代码如下:
const void* Search(const char* startAddress, const char* endAddress, std::regex *re)
{
std::smatch match;
auto ret = std::regex_search(startAddress, endAddress, *re);
Run Code Online (Sandbox Code Playgroud)
在目前的形式下,它工作得很好,但是我想知道它在哪里找到了那个特定的模式。一旦我将匹配添加为参数,编译器就无法找到合适的重载函数。我尝试在该区域之外创建一个string_view
,但编译器也找不到任何适合这些迭代器的重载。
我正在专门寻找std::regex
解决方案。我应该如何使用它?