小编Gau*_*ant的帖子

为什么在 C++ 20 中从标准库容器中删除了比较运算符?

我在浏览cppreference 时看到vectorC++20 中删除了它的比较操作,并<=>引入了飞船运算符 ( )。对于许多其他标准库容器,如set和 ,可以看到同样的事情map

如何在新标准中进行比较?另外,C++20 会开始在旧代码上出错吗?

c++ spaceship-operator c++20

11
推荐指数
1
解决办法
674
查看次数

函子与比较器

我知道函子是一个函数对象,是结构定义中()运算符的重载。同样,在算法中使用函子似乎很简单,只需调用此例程即可。

但是,我无法理解比较器。为什么在模板参数中首先使用它们。

有人可以详细说明两者之间的区别吗?

编辑:

我正在寻找以下问题的答案

  1. 为什么需要比较器而不是功能对象(比较器在容器中更常见?)
  2. 传递比较器而不是函数对象的可能实现(非STL,即C ++代码)

c++ functor comparator c++11

5
推荐指数
1
解决办法
146
查看次数

在字符串上使用指针

我真的很困惑在字符串上使用指针.感觉他们遵守不同的规则.请考虑以下代码

  1. char *ptr = "apple";// perfectly valid here not when declaring afterwards like next
    
    ptr = "apple"; // shouldn't it be *ptr = "apple"
    
    Run Code Online (Sandbox Code Playgroud)
  2. printf()表现不同-

    printf("%s", ptr) // Why should I send  the address instead of the value
    
    Run Code Online (Sandbox Code Playgroud)
  3. 我还在一本书中看到了以下代码

    char str[]="Quest";
    char *p="Quest";
    
    str++; // error, constant pointer can't change
    
    *str='Z'; // works, because pointer is not constant
    
    p++; // works, because pointer is not constant
    
    *p = 'M'; // error, because string is constant
    
    Run Code Online (Sandbox Code Playgroud)

我无法理解应该暗示什么

请帮忙,我在其他地方找不到任何信息

c c-strings char-pointer

4
推荐指数
1
解决办法
329
查看次数

链接错误:静态变量的多重定义

所以我先写了下面的代码,却遇到了编译错误。阅读此答案后: 静态数组类变量“多重定义”C++ 我修改了我的代码并将静态变量定义移动到一个 cpp 文件并且它执行得很好,但是我无法理解当我使用了预处理器防护时,为什么它显示多个定义错误?

#ifndef GRAPH_H

#define GRAPH_H
#include<iostream>
#include<vector>
using namespace std;

struct node{
  int element=0;
  static vector<bool> check;
  node(){
    if(check.size()<element+1)
      check.resize(element+1);
    }
};

vector<bool> node::check;

#endif
Run Code Online (Sandbox Code Playgroud)

static-variables linker-errors c++11

3
推荐指数
1
解决办法
2194
查看次数

为什么结构和类定义可以在多个翻译单元上重复?

根据一个定义规则,类和结构定义不得在单个翻译单元中重复。

但是,为什么这样的话,如果它们实际上是定义,则允许以多个翻译单元重复它们。在这种情况下,链接器为什么不引发多定义错误?

例如-以下操作应通过相同的逻辑引发多个定义错误

测试

#ifndef TEST
#define TEST

class s {
  int a;
  int b;
};

#endif
Run Code Online (Sandbox Code Playgroud)

test1.cpp

#include "test.h"

int main() {}
Run Code Online (Sandbox Code Playgroud)

test2.cpp

#include "test.h"
Run Code Online (Sandbox Code Playgroud)

c++ linker-errors language-lawyer

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