RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / user-203448

BadCatss's questions

Martin Hope
BadCatss
Asked: 2022-04-11 20:38:23 +0000 UTC

Python中的对象管理在处理属性和静态属性时?

  • -1

以下代码如何工作: - 同一类的不同对象如何具有不同数量的属性? class MyClass: pass p1 = MyClass() p1.atrib1="1" p1.atrib2="2" p1.atrib3="3"
p2 = MyClass() p2.atrib1="1" p2.atrib2="2"
print(p1.atrib3) // ok print(p2.atrib3) //error

这在内部是如何工作的,鉴于在 Python 中,构造函数不会阻止向现有对象添加新属性,而是确保每个创建的对象都具有一组特定的属性。

对象属性和类属性(静态属性)——所有对象都可用——与其他 PL 相比如何?例如,在 C++ 中 - 有字段和方法变量 - 区别在于范围,有静态变量 - 仅在访问类时可用,对对象不可用。据我了解,Python 中的对象属性类似于 C++ 中的字段(但我仍然不清楚每个对象如何拥有它们),静态属性只是 C++ 中静态字段的模拟,但在 Python 中 -是否可以通过特定对象访问它们?

PS - 问题的标签包含 C++ 标签 - 因为我想使用仅与 C++ 进行比较的示例来了解想法的差异。

python
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2021-10-31 05:37:26 +0000 UTC

QVector append 和 push_back 的区别

  • 0
//Этим можно не забивать голову, в своей сути - Vector<T>
//Указанно полностью, для "общей картины" вопроса    
typedef QVector<QPair<QPair<QString,LexemType>, QVector<int>>> tokenType ; 
    QSet<QString> MainWindow::_brackets={"(",")","{","}","[","]","<",">"};
    tokenType tokens;
    QStringList tmp = str.split(" ");
    for (int var = 0; var < tmp.length(); ++var)
    {
      if (_brackets.contains(tmp.at(var))) {processBrackets(tmp.at(var));}
    }
    
    QVector<tokenType> MainWindow::processBrackets(const QString &inputStr)
    {
    static QVector<tokenType> foundTokens;
    .......
    return  foundTokens;
    
    }

为什么 tokens.push_back(d.at(var));- 给出:

mainwindow.cpp:54:24: 错误: 没有匹配的成员函数调用'push_back' qvector.h:272:17: 注意: 候选函数不可行: 从 'const QVector<QPair<QPair<QString, LexemType 没有已知的转换>, QVector > >' to 'const QPair<QPair<QString, LexemType>,

第一个参数 qvector.h:273:10 的 QVector >':注意:候选函数不可行:没有从 'const QVector<QPair<QPair<QString, LexemType>, QVector >>' 到 'QPair<QPair<QString, 的已知转换LexemType>, QVector>' 第一个参数

, 和 tokens.append(d.at(var));- 不是吗?

虽然 tokens.push_back(d.at(var));- 里面是这样排列的 void push_back(T &&t) { append(std::move(t))};

- 指同一个 inline void append(const QVector<T> &l) { *this += l; }

c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-08-10 06:06:31 +0000 UTC

模板中的参数化类型名?

  • 0

在声明模板函数时,是否可以指定给定的类型名也将被参数化?例如:

template <typename t1, typename t2<T>>
void SomeFunc()
{
t1 var;
t2<T> list;
std::invoke(&t2::insert,list,var)
}

int main()
{
SomeFunc<std::list<std::string>,std::string>();
return 0;
}
c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-07-06 20:18:21 +0000 UTC

从Qt中的字符串中删除表情符号?

  • 0

有一个表情符号https://emojipedia.org/tooth/ - 您需要将其从字符串中删除。

Unicode 取自这里:https ://www.fileformat.info/info/unicode/char/1f9b7/index.htm

选项:

C/C++/Java 源代码“\uD83E\uDDB7”

if (d->at(k).contains(u8"\\uD83E\\uDDB7")) 




if (d->at(k).contains(QString::fromUtf8(QByteArray("f09fa6b7"))))

这两个选项都不起作用。

此外,当输出 Qdebug() 时,字符显示为https://www.fileformat.info/info/unicode/char/1f9b7/index.htmU0001F9B7 判断- 这是

Python 源代码 u"\U0001F9B7"

选项:

(*d)[k]=(*d)[k].remove("\\U0001F9B7");

- 也不起作用。

小说明:

在 Qt 中,调试时,这个 emoji 显示为两个字符55358(0xd83e)和56759 (0xdbd7),就像这里:

http://www.mauvecloud.net/charsets/CharCodeFinder.html (检查 - 🦷)

此外,检查这两个字符:

if (d->at(k).contains("0xd83e")) 和 if (d->at(k).contains("0xdbd7"))- 正好相反,但是

const_cast<QString*>(&d->at(k))->remove("\0xd83e");
const_cast<QString*>(&d->at(k))->remove("\0xdbd7");

- 没有效果。

主要问题:

请告诉我如何删除此符号及其子公司(表情符号)

附加问题: 此外,您可以阅读有关编码及其格式的问题。

UPD:这些选项不起作用。

                        (*d)[k]=  (*d)[k].replace("\\55358","");
                        (*d)[k]=  (*d)[k].replace("\\56759","");
                        (*d)[k]=  (*d)[k].replace("\\154076","");
                        (*d)[k]=  (*d)[k].replace("\\156667","");

                        (*d)[k]=  (*d)[k].replace("\\0xdbd7","");
                        (*d)[k]=  (*d)[k].replace("\\56759","");

                        (*d)[k]=  (*d)[k].remove("\\55358");
                        (*d)[k]=  (*d)[k].remove("\\56759");
                        (*d)[k]=  (*d)[k].remove("\\154076");
                        (*d)[k]=  (*d)[k].remove("\\156667");

                        (*d)[k]=  (*d)[k].remove("\\0xdbd7");
                        (*d)[k]=  (*d)[k].remove("\\56759");
                        (*d)[k]=(*d)[k].remove("\\U0001F9B7");
            (*d)[k]= (*d)[k].remove(QRegularExpression("[\\x{1F600}-\\x{1F7FF}]+"));
                        (*d)[k]=(*d)[k].remove(QRegExp("(\\\\u[0-9a-fA-F]{4})"));
            (*d)[k]=(*d)[k].remove(QRegExp("\\\\[0-9]{5,}"));

                        (*d)[k]=   (*d)[k].remove("");
                        QRegularExpression numberRegularExpression("\\\\[0-9]{5}"); 
            //или  numberRegularExpression("[\\x{1F600}-\\x{1F7FF}]+")
            //или  numberRegularExpression("(\\\\u[0-9a-fA-F]{4})")

起初我试图拉出 ESC 序列,然后 - 我想反转和拉伸,除了 hasNext 之外的所有东西都不起作用

                        QRegularExpressionMatchIterator i = numberRegularExpression.globalMatch( (*d)[k]);

                        //find template matches
                        // numberRegExp.indexIn(tmpNumber);
                        //get coincidences
                        QStringList capturedData;//=numberRegExp.capturedTexts();

                        while (i.hasNext()) {
                            QRegularExpressionMatch match = i.next();
                            QString word = match.captured(1);
                            capturedData << word;
                        }
                        insertDataQuery.bindValue(columns.at(k),d->at

此外,该主题的英文选项也无济于事:

https://stackoverflow.com/questions/12807176/php-writing-a-simple-removeemoji-function/57744278#57744278

这是一个简单的正则表达式,但支持它!

$re = '/[ (\x{1F600}-\x{1F64F})| (\x{2700}-\x{27BF})| (\x{1F680}-\x{1F6FF})| (\x{24C2}-\x{1F251})| (\x{1F30D}-\x{1F567})| (\x{1F900}-\x{1F9FF})| (\x{1F300}-\x{1F5FF}) ]/mu';

c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-07-04 23:58:27 +0000 UTC

Qt 中完全支持 utf8mb4 以将表情符号存储在 MySql 表中?

  • 0

问题的本质:

Qt 解析包含表情符号字符的文件。

之后,数据以 varchar 类型的属性写入 MySql 类型的表 - InnoDB。将 Emoji 的一部分添加到表格后(以及调试时在 Qt 本身中),例如: https ://emojipedia.org/drop-of-blood/

https://emojipedia.org/tooth/

- 不显示

已经做了什么:

  • 创建一个指定属性编码的表:
   CREATE TABLE IF NOT EXISTS `"+tableName+

   "`(filed1 int not null AUTO_INCREMENT, filed2 varchar(30),

   filed3 varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,  

   filed4 varchar(300) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci,

   filed5 varchar(100),PRIMARY KEY(filed1),INDEX USING BTREE(filed1)"");
  • 设置数据库的编码:
ALTER DATABASE <имя моей базы> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • 在 Qt 中设置编码:

    QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));

有人告诉我:

mysql客户端,顺便也必须使用utf8mb4编码,否则来回转码时emoji也会丢失

因此,我有两个问题:

  1. 从这个线程的帖子来看https://stackoverflow.com/questions/25727970/pasting-emoji-in-qt-qtextedit/25732050#25732050并根据调试器 - qt 将表情符号捕获为转义序列 55358、56759,但很简单不显示(我实际上在编辑器中不需要这个),但是如果字符存在于行中,为什么它们仍然错误地写入表格?

  2. https://bugreports.qt.io/browse/QTBUG-60039?focusedCommentId=358330&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-358330 - 如您所知 utf8mb4 是 MySQL 定义而不是一个真正的编解码器。

- 那么mysql客户端如何使用呢?

另外,我看到连接数据库后需要执行第一个请求的选项:

SET NAMES ("имя кодировки")

问题的简要总结:

与 MySql 客户端一样,如何使用 Qt 在写入表时实现对 Emoji 字符的完全支持?

mysql
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-06-23 02:07:54 +0000 UTC

正则表达式适用于 regex101.com,但不适用于程序代码

  • 1

有以下 QRegExp: QRegExp numberRegExp("^(7|8){1}\d{8,10}$");

  • 要检查 +7********** 或 +8********** 格式的电话号码(不指定 + 号 - 纯粹是示例),检查表达式在https://regex101.com/ - PCRE 格式,但是,当检查时: numberRegExp.exactMatch("some number")- 返回 false。

我将澄清这一行 - 只有数字,仅此而已,在上面的网站上 - 有一个完整的匹配,也就是说,根据文档 - exactMatch- 应该返回 true。

有效数字示例:

71234567891,

81234567891,

7123456789,

8123456789,

712345678,

812345678

  • 即,由一位数字组成的前缀 - 7 或 8 以及前缀后的 8 到 10 位数字。

ps - 我想不出更好的标题,我会感谢建议的编辑和更合适的选项。谢谢。

регулярные-выражения
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-06-10 08:20:02 +0000 UTC

c#和c++中的字符数组

  • 0

c# 中的字符数组:

static char[] invalidСharacters = { '~', '@', '#', '$', '%', '^', '-', '_', '(', ')', '{', '}', '`', '+', '=', '[', ']', ':',
            ',', ';',',', '.', '/', '?','/','\\',':','*','?','«','»','<','>','|','&','—'};

c ++中的字符数组(使用Qt):

 static QStringList invalidСharacters ={ "~", "@", "#", "$", "%", "^", "-", "_", "(", ")", "{", "}", "`", "+", "=", "[", "]", ":",
                    ",", ";",",", ".", "/", "?","/","\\",":","*","?","«","»","<",">","|","&","—"};

问题:为什么在 c# 中 - 字符'«','»','—'= 由几个单个字符组成 - 被视为 char 并且可以通过单引号写入没有问题,而在 c++ 中 - 有必要将这些字符写为字符串(当然,这是合乎逻辑的- 因为 . 有多个字符)。

也就是说,事实上,我的问题更多的是关于 c# 并归结为上面提到的问题,与 c++ 的内部结构相比,什么允许你这样做?

c#
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-06-09 05:50:26 +0000 UTC

元素的编程定位

  • 0

有一个添加了 QHBoxLayout 的窗口:问题的本质 - 必须以编程方式,通过代码 - 对齐元素QLineEdit* searchLine;- 在布局中QHBoxLayout。

澄清:最初,通过表单设计器 - 没有添加布局,也就是说,只是一个完全空的表单,您需要在其上以编程方式添加和对齐所有内容。

.h 文件:

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    QHBoxLayout* mainLayout;
    QLineEdit* searchLine;
//    QSpacerItem* LeftSerchSpacer;
//    QSpacerItem* RightSerchSpacer;
};

我已经尝试做的事情:

.cpp 文件:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    mainLayout = new QHBoxLayout(this);
    searchLine = new QLineEdit(this);

试图对齐整个布局:

 mainLayout->setAlignment(Qt::AlignVCenter);

尝试添加“垫片”:

// LeftSerchSpacer = new QSpacerItem(2000,10);
// RightSerchSpacer = new QSpacerItem(*LeftSerchSpacer);    
// mainLayout->addItem(LeftSerchSpacer);

添加空格:

// mainLayout->addSpacing(this->width()/2);
// mainLayout->setSpacing(this->width()/2);
// mainLayout->setMargin(this->width()/2);
// mainLayout->addStretch(100);

访问特定的小部件并对齐它:

添加时:

//mainLayout->addWidget(searchLine,20,Qt::AlignCenter);

添加后:

mainLayout->setAlignment(searchLine,Qt::AlignVCenter);

// mainLayout->addItem(RightSerchSpacer);
// mainLayout->addSpacing(100);
//  mainLayout->addWidget(searchLine);

    this->setLayout(mainLayout);
    searchLine->setVisible(true);
    ui->setupUi(this);
}
  • 元素对齐的给定选项都不起作用。

PS - 不建议使用表单生成器。该项目具有教育意义,旨在通过编写代码掌握界面元素的创建和布局。我知道在实际项目中 - 没有人会遭受这样的痛苦。

UPD:我尝试了答案中的选项:

mainLayout->addStretch();
mainLayout->addWidget(searchLine);
mainLayout->addStretch();

和

mainLayout->setAlignment(Qt::AlignVCenter);
searchLine->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Maximum);
mainLayout->addWidget(searchLine);
mainLayout->setAlignment(searchLine,Qt::AlignVCenter);
  • 两者都没有效果。

这是有问题的表格的样子: 在此处输入图像描述

(在 QLineEdit 小部件应该大约位于的位置用红色标记)

c++
  • 3 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-29 22:21:17 +0000 UTC

MySqlCommand 以字符串形式获得完整响应

  • 0

有必要从响应到SHOW CREATE TABLE <my_table_name>- 获取服务器的完整响应,以便解析并找到主键的约束。也就是说 - 例如,在 phpMyAdmin 中 - 它看起来像这样: 在此处输入图像描述

如何在c#中将整个响应提取为一行?

 sql = "SHOW CREATE TABLE `" + TableName_textBox.Text + "`";
                command = new MySqlCommand(sql, conn);
                reader = command.ExecuteReader();
                 reader.Read();

                string s = ??????

或者除了解析响应之外还有其他方法 - 获取外键和它所引用的父表的字段?

c#
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-24 20:06:52 +0000 UTC

Qt SqlLite 对非空表进行正常 SELECT 查询后的空列表?

  • 0

有一个听力表 - 食物:

在此处输入图像描述

在此处输入图像描述

void MainWindow:: createConnection()
{
    dbase =   QSqlDatabase::addDatabase("QSQLITE", "foods");
    dbase.setDatabaseName(databaseName + ".db");
    dbase.open();
    if (!dbase.open()) {
        msgBox.setText("Cant connect to database.Cant open datbase file.");
        msgBox.exec();
    }
    else
    {
        QSqlQuery  d(dbase);
        d.prepare("SELECT COUNT(*) FROM foods");
        d.exec();
        int rows ;
        if (d.next()) {
            rows= d.value(0).toInt();
        }

        d.prepare("SELECT * FROM foods");
        d.exec();
        int columns= d.record().count();
        ui->tableWidget->setColumnCount(columns);
        ui->tableWidget->  setRowCount(rows);
        for (int var = 0; var < columns; ++var)
        {
            ui->tableWidget->setHorizontalHeaderItem(var, new QTableWidgetItem(d.record().fieldName(var)));
        }
       if( d.prepare("SELECT name FROM foods"));
       {
        d.exec();
        QList<QVariant> V;
        if (d.next()) {
            V= d.value(0).toList();
        }
        for (int var = 0; var < rows; ++var)
        {
            ui->tableWidget->item(var,0)->setText(V.at(var).toString());
        }
}
    }
}

而且,这里的部分:

d.prepare("SELECT COUNT(*) FROM foods");
    d.exec();
    int rows ;
    if (d.next()) {
        rows= d.value(0).toInt();
    }

返回表的实际行数,但列表 V - 由 0 个元素保持为空:

 if( d.prepare("SELECT name FROM foods"));
   {
    d.exec();
    QList<QVariant> V;
    if (d.next()) {
        V= d.value(0).toList();
    }

我已经尝试创建一个新请求QSqlQuery- d1 并在其上执行请求,但结果是一样的。

sqlite
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-06 18:52:36 +0000 UTC

将 QGraphicsItem 添加到舞台时出现异常?

  • 0

类ball:

ball.h:
#ifndef BALL_H
#define BALL_H
#include <QGraphicsItem>
#include <iostream>


class ball
{
public:
    ball(int x, int y,int R);
    void setPos(int newX, int newY);
    void setSpeed(int newSpeed);
    QPoint getPos();
    int getSpeed();
    QGraphicsEllipseItem* getBall();
private:
    int x;
    int y;
    int R;
    int speed;
    QGraphicsItem* ballObj;
};


#endif // BALL_H

ball.cpp:
#include "ball.h"

ball::ball(int x, int y,int R)
{
    this->x=x+10;
    this->y=y;
    this->R=R;
    ballObj = new QGraphicsEllipseItem(x,y,R,R);

}
void ball::setPos(int newX, int newY)
{
    this->x=newX;
    this->y=newY;
}
void ball::setSpeed(int newSpeed)
{
    this->speed=newSpeed;
}
QGraphicsEllipseItem* ball::getBall()
{
    return  this->ballObj;
}
QPoint ball::getPos()
{
    return QPoint(this->x,this->y);
}
int ball::getSpeed()
{
    return  this->speed;
}

对象创建:

ballObj=new ball(0,this->height(),10);

    gameBoard->scene()->addItem( ballObj->getBall());

游戏板构造函数:

GameBoard::GameBoard(QWidget *parent)
{
    gameBoard = new QGraphicsView();
    mainLayout = new QVBoxLayout();
    gameBoard->setParent(parent);
    gameBoard->setMinimumSize(parent->width(),parent->height());
    gameBoard->setMouseTracking(true);
    gameBoard->grabMouse();

    boardPen.setColor(Qt::black);

    boardlBrush.setStyle(Qt::SolidPattern);
    scene=new QGraphicsScene();

    scene->addEllipse(0, 0, boardlWidth,boardHeigh, boardPen, boardlBrush);
    ballObj=new ball(0,this->height(),10);

    gameBoard->scene()->addItem( ballObj->getBall()); // Строка 20
    gameBoard->setScene(scene); // 21
}

构造函数 - 工作正常 - 在调试器下查看: 在此处输入图像描述

  • 命中断点后的下一步截图

,但是当我尝试添加到场景中时,我得到一个 SegmentationFault - 请参见屏幕截图: 在此处输入图像描述

qt5
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-03 07:12:58 +0000 UTC

QGraphicsView - Qt5 - MouseMoveEvent 没有触发?

  • 0

我使用 Qt。中央小部件:.h 文件:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <gameboard.h>
#include <QMainWindow>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
private:
    Ui::MainWindow *ui;

    GameBoard* gb;
protected:
    void resizeEvent(QResizeEvent *event);
};
#endif // MAINWINDOW_H

构造函数:

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    gb=new GameBoard(this);

}

游戏板类:

.h 文件:

class GameBoard : public QGraphicsView
{
friend class MainWindow;
public:
    GameBoard(QWidget *parent);
private:
 QVBoxLayout* mainLayout;
 QGraphicsView* gameBoard;
 QGraphicsScene* scene;
protected:
   void mouseMoveEvent(QMouseEvent *event);
};

.cpp:

GameBoard::GameBoard(QWidget *parent)
{
    gameBoard = new QGraphicsView();
    mainLayout = new QVBoxLayout();
    gameBoard->setParent(parent);
    gameBoard->setMinimumSize(parent->width(),parent->height());
    gameBoard->viewport()->setMouseTracking(true);

    scene=new QGraphicsScene();
    QPen pen;
    QColor black(0,0,0);
    pen.setColor(black);
    scene->addEllipse(0, 0, 10,10, pen, QBrush(Qt::SolidPattern));
    gameBoard->setScene(scene);
}
void GameBoard::mouseMoveEvent(QMouseEvent *event)
{
    qDebug()<<event->pos().x();
}

用作示例:

https://pro-prof.com/forums/topic/qgraphicsscene-drawing

我决定在这里用英语仔细检查 SO - 同样的方式,标记为解决方案:

https://stackoverflow.com/questions/18817538/how-to-use-mouse-move-event-for-qgraphicsscene

UPD:我忘了澄清即使按下鼠标左键,该事件也不起作用。

qt
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-03 03:36:09 +0000 UTC

平面到球体的几何变换?

  • 0

有一个平面图像 - 地球的地理地图。借助什么变换和变换矩阵,您可以直观地以球形的形式赋予它体积。也就是说,将二维图像变换为在球体上拉伸,或者球体在图像后面并凸出,使平面的中心成为球形。这种类型的投影/转换的名称是什么,您可以阅读有关此主题的专业知识吗?

геометрия
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-07-20 20:04:27 +0000 UTC

在 std::map 中使用和访问 std::pair?

  • 0

假设有一张地图 - 像这样:

map<string,pair<int,int>> operators_sw_map; //use in initialize method

有一种方法可以初始化此映射:

void Initialize()
  { //второй параметр в pair - отвечает за приоритет операции
    //чем больше число - тем выше приоритет
    //0 - бинарная операция
   //1 - унарная операция
  //2  - блок скобок
operators_sw_map["&&"]=make_pair(0,0);
operators_sw_map["||"]=make_pair(1,0);
operators_sw_map["!"]=make_pair(2,1);
operators_sw_map["->"]=make_pair(3,0);
operators_sw_map["<-"]=make_pair(4,0);
operators_sw_map["<->"]=make_pair(5,0);
operators_sw_map["XOR"]=make_pair(6,0);
operators_sw_map["("]=make_pair(7,2);
operators_sw_map[")"]=make_pair(8,2);
 }

接下来,我在开关中使用此地图:

map<string,pair<int,int>>::iterator it= operators_sw_map.find(oper_statement[i]);//ищем оператор


       if (oper_statement[i]=="!") {
           unar_operations=1;

       }

       else  {
           unar_operations=0;
       }
       // проходимся по сгенерированной таблице
       for (int j = 0; j < statement.size(); ++  j) {// столбец

           for (int d = 0; d < LogicalTable[j].size(); d++) { //строка

               switch (it->second) {
               case 0: //&&
               {
     // .....

问题: 这里怎么 -switch (it->second) 引用第一个元素std::pair- 反过来,它是关键map?

c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-05-14 16:24:42 +0000 UTC

容器中的析构函数?

  • 0

假设我们有一个类:

class MyClass1
{
    int a;
    string s;
    ...
};

class MyClass2
{
    list<MyClass1> lst;
}

MyClass2声明将完全破坏容器的析构函数的正确方法是什么?就个人而言,我是这样写的:

~MyClass2()
{
    this->lst.clear();
    this->lst.shrink_to_fit();
}

但this->lst.clear();它为每个容器对象调用析构函数,并且 this->list.shrink_to_fit();根据size. 但是,例如,当size=0, capacity=1,即在任何情况下,容器将在内存中,即使“有条件地” - 其中没有元素。

问题:如何从内存中完全删除容器?

c++
  • 4 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-05-12 23:24:56 +0000 UTC

在 constexpr 中尝试捕获?

  • 2

是否可以在constexpr函数和方法中使用异常处理?

c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-05-12 23:13:19 +0000 UTC

如何将指针转换为迭代器?

  • 2

最近我需要将指针转换为迭代器。在SO上,我找到了这个答案:

https://stackoverflow.com/a/55687896/8212170

在其中,我不完全理解将指针转换为迭代器的语法:

itr = (std::vector<int>::iterator&)(*ptr);  //cast pointer back to iterator

- 我看到一个显式的 C 样式转换,但我无法弄清楚视图绑定的含义:

iterator&)(*ptr)

- 即(*ptr)在我们取消引用指针,获取值,但它是如何相关的iterator&- 我不太明白它是什么语法,因为它看起来不像一个地址获取运算符。

c++
  • 2 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-30 14:21:11 +0000 UTC

emplace 在内存方面是如何工作的?

  • 0

emplace 在内存放置方面是如何工作的?

这是来自 cppreference.com 的 std::vector 的 emplace 定义:

在 pos 之前的容器中插入一个新元素。该元素是内置的,即 不要复制或移动操作。使用 std::forward(args)... 参数调用元素构造函数。元素类型必须是 EmplaceConstructible、MoveInsertable 和 MoveAssignable。

如果新的 size() 大于 capacity(),则所有迭代器和指针都无效。否则,只有迭代器和指向插入元素之后的元素的指针变得无效。

迭代器和指针保持正常工作。

选项

pos - 将在其之前构造新元素的迭代器

args - 传递给元素构造函数的参数

据我了解,向量是内存中的一个连续缓冲区(分配区域),我们可以从中获取大小和容量值。

Size - 返回容器中元素的数量,以及 capacity - 总保留空间。

问题的实质:

如果向量本质上是连续的,那么我们如何在位置 pos 处创建一个新元素 - 而不破坏向量,或者更糟糕的是,不创建新的 vector.size +1 并将所有元素复制到其中 + 一个新元素?

也就是说,如果在与 size 对应的位置执行 emplace 并且如果 size 小于容量,那么我们只需将参数传递给构造函数并创建一个元素。否则,如果我们在某个位置插入(创建)一个对象,例如,对应于向量的中间,据我所知,以下选项是可能的:

插入元素位置之后的所有元素都移动+1并插入到我们需要的位置。

但毕竟,我们必须首先移动向量的元素,然后才能在释放的空间中创建一个新的,并使用与向量类型相对应的元素 - 一切都很清楚,我们知道偏移量对象需要移动,但是派生类型的对象呢?

这是一个小例子来说明我的意思:

/ // ConsoleApplication1.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//

#include "pch.h"
#include <iostream>
#include <vector>
using namespace std;
class Base
{
public:
    int x, y;
    Base() = default;
    virtual ~Base() = default;
};
class Derived :public Base
{
    float z;
public:
    Derived() = default;
    virtual ~Derived() = default;
};
class Base1
{
public:
    virtual void F1()
    {

    }

};
class Derived1 :public Base1
{
     void F1()  override
    {

    }
};

int main()
{
    vector<Base> v(10);
    v.emplace(v.begin() + 2, Derived{});
    vector<Base>::iterator l = v.begin();
    int a = distance(v.begin(), l + 2);
v1.at(a).x;
v1.at(a).y;
v1.at(a).z;//Невозможно – усечене объекта


    ////
    vector<Base1> v1(10);
    v1.emplace(v1.begin() + 1, Derived1{});
    v1.at(a).F1();//усечения быть не должно, т.к может понадобиться реализация из производного класса
}

问题涉及虚拟方法,在这种情况下,如何在对象构建之前为对象分配内存,因为 vpt 导致对象的大小无法准确知道?

也就是说,在这种情况下会发生什么:

v1.at(a).F1();//усечения быть не должно, т.к может понадобиться реализация из производного класса

也就是说,我的意思是,在创建对象之前,我们无法确定对象的大小,而且我们无法创建它——因为根据定义,emplace 是在适当的位置进行的,而不是在单独的内存区域中的某个地方,但我们也无法创建“现场”,因为我们不知道移位元素的偏移量。

c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-22 01:57:11 +0000 UTC

std::move 是如何工作的?[关闭]

  • -1
关闭。这个问题需要澄清或补充细节。目前不接受回复。

你想改进这个问题吗?通过编辑此帖子添加更多详细信息并澄清问题。

3年前关闭。

改进问题

出现了以下问题:std::move 在粘合链接方面如何工作?

问题与 stepic 平台上的课程有关 - “C++ 编程(续)”

澄清:后续问题,以及它在 SO 社区眼中的“无用”,绝不反映问题作者“不理解问题”的愿望或形成过程中的咄咄逼人的态度. 这个问题是根据上述课程的材料提出的,不能比上一个问题更丰富。

std::move 如何处理右值和左值引用? 在此处输入图像描述

c++
  • 1 个回答
  • 10 Views
Martin Hope
BadCatss
Asked: 2020-04-12 21:24:23 +0000 UTC

构造函数的“继承”如何在 C++11 标准中工作?

  • 2

在 c++11 中“继承”构造函数时,有一个关于 using 关键字的问题。

(我想澄清一下,我知道根据标准 - 构造函数不是继承的,这就是为什么“继承”这个词用引号引起来)

“继承”构造函数时 using 关键字如何工作?

此时会发生什么 - 基类的构造函数完全复制到派生类的对象中,还是类似于类之间的委托?

c++
  • 1 个回答
  • 10 Views

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5