小编Jar*_*d42的帖子

myArray [N],其中N = 1,000,000会返回错误,而myArray [1,000,000]则不会

文件扩展名:.cpp

我有以下代码:

int main() {
    int N; cin >> N;
    int myArray[N];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

如果我输入N为1,000,000,那么当我尝试运行该程序时,我会收到错误.但是,当我设置myArray[N]myArray[1000000],它没有.为什么会这样?

c++ variable-length-array

2
推荐指数
1
解决办法
122
查看次数

我怎么能跳过那些警告?C++

已添加代码:

bool CHARACTER::SpamAllowBuf(const char *Message)
{
    if (!strcmp(Message, "(??´c)") || !strcmp(Message, "(?·)") || !strcmp(Message, "(±a?Y)") || !strcmp(Message, "(AA??)") || !strcmp(Message, "(?c¶?)") || !strcmp(Message, "(???e)") || !strcmp(Message, "(??C?)") || !strcmp(Message, "(????)") || !strcmp(Message, "(AE??)"))
    {
        return true;
    }

    return false;
}
Run Code Online (Sandbox Code Playgroud)

警告给出:

char.cpp:7254:121: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:245: warning: trigraph ??) ignored, use -trigraphs to enable
char.cpp:7254:275: warning: trigraph ??) ignored, use -trigraphs to enable
Run Code Online (Sandbox Code Playgroud)

我怎么能跳过这个警告?

c++ trigraphs

2
推荐指数
1
解决办法
90
查看次数

什么是根据它们在句子中的位置对这些字符串输入进行排序的更快的方法?

为国家信息学奥林匹克运动会的实践偶然发现了一个问题:用户输入句子中的单词数量(n)以及输入单词的收益以及用空格分隔的位置.系统会要求您输入正确的单词顺序.

例如:

输入:

4
this 1
sentence 4
is 2
a 3
Run Code Online (Sandbox Code Playgroud)

输出:

this is a sentence
Run Code Online (Sandbox Code Playgroud)

限制:

1 <= N <= 3 * 10^5
1 <= Size of a word <= 50
Run Code Online (Sandbox Code Playgroud)

我试图使用unordered_map解决这个问题,事实证明这很快解决了所有测试案例只需0.588秒,这使我的解决方案成为45中最快的第五个.但是最快的解决方案只需要0.14秒来计算我无法弄清楚他/她是如何做到的.与使用unordered_map相比,解决此问题的更快捷方法是什么?

unordered_map < int, string > words;    
int n;    
cin >> n;  
for (int i = 0; i < n; i++) {    
    string word;    
    int position;     
    cin >> word >> position;    
    words[position] = word;    
}    
for (int i = 1; i <= n; i++) {     
    cout << …
Run Code Online (Sandbox Code Playgroud)

c++ optimization

2
推荐指数
1
解决办法
67
查看次数

头文件中的内联Lambda

这与我所见过的其他问题类似,但是考虑到C ++ 17对内联变量的介绍,值得提出。考虑以下模式:

auto to_ref = [](auto const& ptr) -> decltype(auto) { return *ptr; }

std::vector<std::unique_ptr<Foo>> foo_ptrs = from_somewhere();
for (Foo const& foo : foo_ptrs | transform(to_ref)) {
}
Run Code Online (Sandbox Code Playgroud)

to_ref通用拉姆达是......嗯,通用...所以是有意义的把它放在一个头这样的人不是到处复制它。

我的问题:模板的链接注意事项也适用于通用lambda吗?换句话说,编译器/链接器有责任确保对于具有相同模板参数的给定模板的多个实例化,不违反ODR。我可以依靠相同的行为,还是应该在inline说明符之前添加说明符auto to_ref = ...;

c++ lambda one-definition-rule

2
推荐指数
1
解决办法
131
查看次数

我需要在构造函数中显式初始化 std::unique_ptr 吗?

我有一堂课,其中一个领域是std::unique_ptr<SomeClass>. 构造父类对象时,此字段最初未设置。我是否需要做:

field_(nullptr)
Run Code Online (Sandbox Code Playgroud)

或者这个字段会自动初始化为默认值,并且为空?

c++ constructor unique-ptr

2
推荐指数
1
解决办法
505
查看次数

在类中将函数作为参数传递

所以我正在尝试为一个项目争取使用ESPAsyncWebServer,并且由于所述项目的大小,我将我的代码重构为一堆不同的库。这是客户端服务器处理部分的一部分。

我已经确定如何有效地将 *request 传递给单独的函数,以便清理我的代码。IE 在我的库中的 .cpp 文件

server->on("/heap", HTTP_GET, [this](AsyncWebServerRequest *request) { handleHeap(request); });
Run Code Online (Sandbox Code Playgroud)

哪个火:

void CServer::handleHeap(AsyncWebServerRequest *request) { request->send(200, "text/plain", String(ESP.getFreeHeap())); }
Run Code Online (Sandbox Code Playgroud)

我遇到问题的地方是试图将我的“处理器”函数传递给模板响应。

String CServer::processor(const String &var)
{
if (var == "locationLat")
return String(gps.location.lat());
return String();
}

void CServer::handleGPS(AsyncWebServerRequest *request)
{
request->send(SPIFFS, "/gps.htm", String(), processor);
}
Run Code Online (Sandbox Code Playgroud)

错误:没有匹配的函数调用 'AsyncWebServerRequest::send(fs::FS&, const char [9], String, )

尝试在 Lambda 中传递 processor() 也不会编译,因为没有传入参数。

错误:没有匹配的函数调用 ' CServer::processor()' request->send(SPIFFS, "/gps.htm", String(), [this] { processor(); });
^ lib\CServer\CServer.cpp:128:66:注意:
候选是:lib\CServer\CServer.cpp:108:8:注意:字符串
CServer::processor(const String&)

sooo,我如何按照此处的指南中的说明处理将所需的处理器函数传递到我的响应参数中 …

c++ refactoring arduino esp8266

2
推荐指数
1
解决办法
489
查看次数

使用初始化列表将模板大小数组传递给函数

我有一个模板化函数,它以std::array任意大小作为参数。它看起来大致是这样的:

template <size_t n>
void foo(const std::array<int, n>& numbers) {
    for (const auto & number: numbers) {
        // ... do stuff ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以这样称呼它:

std::array<int, 2> ints = {4, 5};
foo(ints);
Run Code Online (Sandbox Code Playgroud)

一切都很好。

不幸的是,我无法使用初始化列表直接调用该函数。这段代码:

foo({4, 5});
Run Code Online (Sandbox Code Playgroud)

给了我以下错误:

错误:没有匹配的成员函数来调用“foo”
注意:候选模板被忽略:无法推断模板参数“n”

有没有办法使用初始化列表或类似的东西使我的函数工作?

c++ templates initializer-list

2
推荐指数
1
解决办法
108
查看次数

按引用或指针传递 char 或 short 是否比按值传递慢?

我一直听说它说通过引用传递而不是值(复制)对于大于intlong long避免复制的类型更有效。当一个参数按值传递时,该值被推送到函数中完成操作的堆栈上,但我看到的方式是,当您传递引用或指针时,您正在传递变量的地址。如果是这种情况,CPU 是否必须从该地址获取该值,该地址不像堆栈变量那样是本地的,从而导致获取可能不在缓存中的数据?这是否意味着通过引用或指针传递类似charshort更慢的东西?我听说它说对于这些类型没有区别,但如果没有,

c c++ performance

2
推荐指数
1
解决办法
126
查看次数

指定构造函数时列表初始化的不同行为

我有这样的代码,例如:

class A {
public:
    int x;

    A() {
        std::cout << "Constructor Called !" << std::endl;
    }
    A(int y):x(y) {
        std::cout << "Constructor Param Called !" << std::endl;
    }

    A(const A& copy) {
        std::cout << "Copy Constructor Called !" << std::endl;
    }
}

class B {
public:
    A value;
    //B(const A& val) : value(val){}
}

int main(){
    B b { A(22)};
}
Run Code Online (Sandbox Code Playgroud)

如果我注释掉 B 构造函数,则输出只是“调用构造函数参数”,但如果我取消注释 B 构造函数,则输出将是“调用构造函数参数”和“调用复制构造函数”。我的问题:

  1. 如果我注释掉构造函数,为什么输出会不同?(我读过有关聚合类和聚合初始化的内容,是这样吗?)
  2. 聚合初始化直接初始化有什么区别?

c++ initialization c++17

2
推荐指数
1
解决办法
83
查看次数

为什么在 C++11 之后 std::basic_string 的尾后迭代器的取消引用仍然是 UB?

众所周知,C++11 添加了一个 null 终止符std::basic_string(这不计入大多数成员函数)。但是当我阅读cpp ref时,我发现对 UB 的取消引用(这一段与 std::vector 的段落end()几乎相同)。为什么会出现这种情况?或者这是 cpp ref 的错误(请提供此文档以进行验证)?

我尝试过 GNU C++,但不幸的是 __gnu_debug 似乎不包含std::string迭代器检查器。Clang++ 的消毒剂也没有。

c++ iterator stdstring undefined-behavior c++17

2
推荐指数
1
解决办法
118
查看次数