UVa_10115 - Automatic Editing(POJ 1572)

本文介绍了一道简单的C++编程题目,通过使用标准库中的string类型及其成员函数实现字符串内容的查找与替换。该程序能够接收多条替换规则,并依次应用于输入文本中。

简单模拟题,用C++的string操作非常简单,注意循环的跳出即可

代码如下:

#include<iostream>
#include<string>
using namespace std;

string str[10];
string newstr[10];
string text;

void Edit(string a,int n)
{
    for(int i=0;i<n;i++) //按照规则查找
    {
        int j;
        while(1) //不断查找并应用第i条规则
        {
            if((j=text.find(str[i]))!=string::npos){
                text.replace(j,str[i].length(),newstr[i]);
            }
            else break; //找不到,跳出,进行下一条规则
        }
    }
}
int main()
{
    int n;
    while(cin>>n&&n!=0)
    {
        cin.get();
        for(int i=0;i<n;i++)
        {
            getline(cin,str[i]);
            getline(cin,newstr[i]);
        }
        getline(cin,text);
        Edit(text,n);
        cout<<text<<endl;
    }
    return 0;
}

<think>我们逐句解释这段C++代码的功能。代码属于一个名为`ArraySearchSetupWidget`的类,具体是`OnToiAddBtnClicked`槽函数(或事件处理函数)的实现。 1. `if (m_interactionLock) { return; }` - 如果`m_interactionLock`为真(表示当前有交互锁定),则直接返回,不执行后续操作。 2. `if (m_tableModifyLock) { return; }` - 如果`m_tableModifyLock`为真(表示表格修改被锁定),则直接返回。 3. ```cpp if (m_editCrToggle || m_editAoiToggle || m_editToiToggle) { API::GetMainApi()->SetStatusInfoMsg("Cannot draw while editing cell template", 3000); return; } ``` - 如果当前处于编辑CR(可能指某个区域)、AOI(感兴趣区域)或TOI(目标感兴趣区域)的状态,则通过API设置状态信息提示“在编辑单元格模板时无法绘制”,并显示3000毫秒,然后返回。 4. `int index = m_toiAddTableModel->rowCount() + 1;` - 计算新行的索引值,为当前表格行数加1。 5. `auto defaultFlag = std::make_pair(FLAG_ROLE, static_cast<int>(Qt::ItemIsEnabled | Qt::ItemIsSelectable));` - 创建一个默认的标志对,用于设置表格项的标志(ItemFlags),这里指定为可启用和可选择。 6. `QString untitledName = QString::fromStdString("SearchArea " + std::to_string(index));` - 生成一个默认的未命名区域名称,格式为"SearchArea "加上索引值(如"SearchArea 1")。 7. 定义`RowData`类型的变量`newRow`,这是一个自定义类型(可能是`QVector`或`QList`等容器),用于存储一行中不同列的数据。每一列的数据是一个映射,键为列标识(如`CHECK_KEY`, `TABLE_HEADER_REVIEW`等),值为一个包含多个角色-值对的列表。 - `{CHECK_KEY, {{Qt::CheckStateRole, Qt::Unchecked}}}`: 第一列(假设)是复选框,初始状态为未选中。 - `{TABLE_HEADER_REVIEW, {{Qt::CheckStateRole, Qt::Checked}}}`: 另一列(可能是审核列)的复选框,初始状态为选中。 - `{TABLE_HEADER_INDEX, {{Qt::EditRole, index}, {EDIT_TYPE_ROLE, TOI_ADD_INDEX}, defaultFlag}}`: 索引列,设置编辑角色为索引值,自定义角色`EDIT_TYPE_ROLE`为`TOI_ADD_INDEX`,并设置默认标志(可启用和可选择)。 - `{TABLE_HEADER_COLOR, {{Qt::EditRole, ""}, {Qt::DecorationRole, BLANCKPATTERN_KEY}, {EDIT_TYPE_ROLE, TOI_ADD_COLOR}, defaultFlag}}`: 颜色列,编辑角色为空字符串,装饰角色(用于显示颜色)为`BLANCKPATTERN_KEY`(可能表示空白图案),自定义角色为`TOI_ADD_COLOR`。 - `{TABLE_HEADER_TOI, {{Qt::EditRole, ""}, {EDIT_TYPE_ROLE, TOI_ADD_TOI}, defaultFlag}}`: TOI名称列,编辑角色为空,自定义角色为`TOI_ADD_TOI`。 8. `m_toiAddTableModel->PushBack(newRow);` - 将新行数据`newRow`添加到表格模型`m_toiAddTableModel`的末尾。 9. ```cpp m_toiAddTableModel->setData(m_toiAddTableModel->index(m_toiAddTableModel->rowCount() - 1, 3), RandomColor().name(), Qt::EditRole); ``` - 设置新行中第3列(从0开始计数,所以实际是第4列)的数据。这里使用`RandomColor()`生成一个随机颜色,并将其名称(如"#RRGGBB")设置为该列的编辑角色数据。注意:在之前定义`newRow`时,颜色列是第3列(因为`TABLE_HEADER_COLOR`在`RowData`中是第3个元素,对应列索引3?但通常列索引从0开始,所以这里第3列可能是索引3,但注意定义顺序不一定对应列顺序,但根据上下文,这里应该是颜色列)。另外,在创建行时,颜色列已经设置了`Qt::DecorationRole`为空白图案,这里再设置`EditRole`为颜色字符串,可能是为了存储颜色值。 10. `m_toiAddTableView->setRowHeight(m_toiAddTableModel->rowCount() - 1, 24);` - 设置表格视图中新添加的行的高度为24像素。 11. `m_layoutViewerInstance->ActivateService(m_drawToiService);` - 激活绘制TOI的服务,即开始绘制新的搜索区域。 12. `return;` - 函数返回。 总结:该函数用于在点击“添加TOI”按钮时,在表格中添加一行新的TOI(目标感兴趣区域)设置,包括索引、颜色和名称,并激活绘制服务。在添加前会检查是否满足添加条件(无交互锁定、无表格修改锁定、没有处于编辑状态)。 §§相关问题§§ 1. 在代码中,`m_interactionLock`、`m_tableModifyLock`、`m_editCrToggle`等变量的作用是什么? 2. `RowData` 的数据结构是如何定义的?它如何与表格的列对应? 3. `RandomColor()` 函数的具体实现是什么?它如何生成随机颜色? 4. 为什么在设置颜色列数据时,同时使用了`Qt::DecorationRole`和`Qt::EditRole`? 5. `m_layoutViewerInstance->ActivateService(m_drawToiService)` 这行代码激活了绘制服务,那么绘制服务`m_drawToiService`具体是如何工作的?</think>这段代码是`ArraySearchSetupWidget`类中`OnToiAddBtnClicked`方法的实现,用于处理"添加TOI(目标感兴趣区域)"按钮的点击事件。逐行解释如下: 1. **`if (m_interactionLock) { return; }`** 检查交互锁定标志,若为真则直接返回(防止重复操作)。 2. **`if (m_tableModifyLock) { return; }`** 检查表格修改锁定标志,若为真则直接返回(防止表格数据冲突)。 3. **`if (m_editCrToggle || ... ) { ... return; }`** 检测是否处于编辑状态(CR/AOI/TOI编辑模式),若在编辑中则显示提示消息"无法在编辑单元格模板时绘制"并返回。 4. **`int index = ... + 1;`** 计算新行的索引值:当前表格行数+1。 5. **`auto defaultFlag = ...`** 创建默认单元格标志:启用`Qt::ItemIsEnabled | Qt::ItemIsSelectable`(允许选择但不可编辑)。 6. **`QString untitledName = ...`** 生成默认区域名称:"SearchArea " + 索引值(如"SearchArea 3")。 7. **`RowData newRow = { ... }`** 创建新行数据模型: - **CHECK_KEY列**:未勾选的复选框 - **REVIEW列**:已勾选的审核状态 - **INDEX列**:显示索引值,标记为TOI_ADD_INDEX类型 - **COLOR列**:空白颜色块,标记为TOI_ADD_COLOR类型 - **TOI列**:空文本,标记为TOI_ADD_TOI类型 8. **`m_toiAddTableModel->PushBack(newRow)`** 将新行数据添加到表格模型末尾。 9. **`m_toiAddTableModel->setData(...)`** 设置新行第3列(COLOR列)的数据:调用`RandomColor()`生成随机颜色值。 10. **`m_toiAddTableView->setRowHeight(...)`** 设置新添加行的高度为24像素。 11. **`m_layoutViewerInstance->ActivateService(...)`** 激活绘图服务`m_drawToiService`(准备绘制新区域)。 12. **`return;`** 方法结束返回。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值