首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >基于条件C++的矢量元素复制

基于条件C++的矢量元素复制
EN

Stack Overflow用户
提问于 2015-05-29 12:48:57
回答 2查看 2K关注 0票数 0

我使用C++来创建Hopcroft的DFA最小化算法。

Hopcroft算法的一部分是对两个集合(P有接受状态和非接受状态,q只有非接受状态)进行初步划分。我已经有了P组,我试图从P中提取Q值,我使用以下代码来实现它:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
for(int i=0; i<groupP.size(); i++)
    if(groupP[i]->final)
        groupQ.push_back(groupP[i]);

其中groupP和groupQ是:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<node*> groupQ;
vector<node*> groupP;

节点是我为表示自动机的一个节点而创建的一个结构。它保证布尔属性" final“已经正确设置(非最终状态为false,最终状态为true )。

最后,我的问题是:通过执行我所做的工作,将一个元素从一个向量复制到另一个元素是否正确?如果我从groupP修改复制的元素的内容,这个元素也会在groupQ中被修改吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-29 13:40:30

现在,你有指针的向量。当您从一个向量复制到另一个向量时,您复制的是指针,而不是元素本身。

由于您有两个指向同一个节点的指针,对一个节点所做的任何修改都将在另一个组中可见--也就是说,如果您更改了groupP[i]->foo,那么相同的更改将在groupQ[j]->foo中可见(前提是groupP[i]是从groupP复制到groupQ的元素之一)。

如果你不想那样,你有几个选择。一种方法是将groupPgroupQ保留在同一个向量中,但是根据元素的final成员的状态对该向量进行分区:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
auto P_end = std::partition(groupP.begin(), groupQ.end(), 
                              [](node *n) { return n->final;});

然后[groupP.begin(),P_begin)是groupP (即final==true),而[P_begin,groupP.end()]是groupQ (即final==false)。

这会移动指针(并给出一个迭代器,使您知道这两个元素之间的分界线),因此您有一个指向每个元素的指针,但是它们被分离成两个相关的组。

最后一种可能是,您可能希望将元素从groupP实际复制到groupQ,并且在此过程中创建一个新元素,因此在您将项目从groupP复制到groupQ之后,您复制的每个项目现在在两个位置存在--即groupP中有一个元素,groupQ中有一个元素。任何一个都可以修改,但它们是分开的,所以两者都可以修改,但是对其中一个的修改对另一个没有影响。

要做到这一点,最明显的方法是只使用节点的向量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
vector<node> groupQ;
vector<node> groupP;

这样,当您从一个组复制到另一个组时,您将复制节点本身,而不是指向节点的指针,因此每个副本创建一个新的独立节点,其值与现有节点的值相同。

票数 3
EN

Stack Overflow用户

发布于 2015-05-29 12:49:58

您可以使用如果,它可以做同样的事情:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
std::copy_if(groupP.cbegin(), groupP.cend(),
             std::back_inserter(groupQ),
             [](node* n){ return n->final; });

由于您正在操作指针,元素本身是共享的,因此可以从另一个容器中看到修改一个容器中的节点。

注意,像您正在做的那样操作原始指针非常容易出错,例如,您可能希望使用共享指针

编辑:添加缺少的std::back_inserter

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30538803

复制
相关文章
C++条件编译 | 条件编译
在C++中,在进行编译时对源程序中的每一行都要编译,但是有时希望程序中某一部分内容只在满 足一定条件时才进行编译,也就是指定对程序中的 一部分内容进行编译的条件,如果不满足这个条 件,就不编译这部分内容,这就是条件编译。
小林C语言
2020/12/01
2.5K0
C++条件编译 | 条件编译
基于运动矢量重用的转码优化
 点击上方“LiveVideoStack”关注我们 ▲扫描图中二维码或点击阅读原文▲ 了解音视频技术大会更多信息 编者按:视频转码是视频相关领域中最重要的业务,需要消耗大量的算力。转码有解码和编码两个阶段,在编码中,运动矢量计算是消耗CPU算力最多的部分,因此要考虑如何减少大量的计算并提高图像质量。LiveVideoStack邀请到了英特尔的谢义老师,为我们介绍基于运动矢量重用的转码优化。 文/谢义 整理/LiveVideoStack 大家好!我是谢义,来自英特尔亚太研发有限公司。我们团队主要负责基于至强
LiveVideoStack
2023/02/23
4750
基于运动矢量重用的转码优化
【说站】python删除元素的使用条件
(1)函数remove()只删除指定的第一个值。如果想删除的值可能会在列表中出现多次,那么需要使用循环来确定是否所有此类值都删除。
很酷的站长
2022/11/23
8850
【说站】python删除元素的使用条件
C++条件分支结构
实数的余数——两个参数分别是被除数和除数double fmod(double, double)
风骨散人Chiam
2020/10/28
5580
❤️C++条件语句教程❤️
使用该if语句指定在条件为 时要执行的 C++ 代码块为true。 注意 if是小写字母。大写字母(If 或 IF)将产生错误。 例如:
川川菜鸟
2021/10/19
5490
C++ 复制控制之复制构造函数
C++类用三个特殊的成员函数:复制构造函数、赋值操作符和析构函数 来决定类对象之间的初始化或赋值时发生什么。所谓的“复制控制”即通过这三个成员函数控制对象复制的过程。本篇文章将介绍复制构造函数。
Tencent JCoder
2022/05/06
7910
count_if按条件统计元素个数
区别:为什么count那里要加const,这边不要 因为count那里是进行元素比较操作,需要重载==运算符,要让底层识别,所以要加const 而这边是作为条件,将元素放入仿函数中看是否符合条件 总结:最好都加上const
大忽悠爱学习
2021/03/02
9960
count_if按条件统计元素个数
盘点Arrays工具类中复制元素和填充元素的常用方法
在java的util包中提供了一个Arrays工具类用来操作数组的,它提供了许多的静态方法,例如数组所有元素进行排序,按从小到大的顺序、查找元素等。使用时需要导包如下所示:
Java进阶者
2021/08/20
7820
C++对象的赋值和复制
本文属于上篇博文《C++区别于其他语言的知识点总结》第13小节。 13.对象的赋值和复制 对象的赋值:C++中对象可以使用”=”进行赋值,通过重载”=”号运算符实现,实际上这个过程是通过成员赋值(mewberwise copy)实现的,即将一个对象的成员一一赋值给另一对象的对应成员。注意:对象的赋值只是对其中数据成员的赋值,而不是对成员函数赋值。 对象1 = 对象2;//浅拷贝 浅复制 Box *b1 = new Box(1, 2, 3); //C++类Java对象声明 必须使用指针 Box *b
Steve Wang
2018/02/05
3.2K0
MySQL基于复制的架构方案
MySQL复制是一个非常简单而有方便进行架构扩展的功能,可以说是运维必备,我们通过对主从进行不同的组合,可以满足我们相应的需求。 分享目录: 一主一从,高可用 一主一从,读写分离 一主多从,读写分离
老七Linux
2018/05/09
7590
基于python的mysql复制工具
python-mysql-replication 是基于python实现的 MySQL复制协议工具,我们可以用它来解析binlog 获取日志的insert,update,delete等事件 ,并基于此做其他业务需求。比如数据更改时失效缓存,监听dml事件通知下游业务方做对应处理。
用户1278550
2019/07/01
2.6K0
基于python的mysql复制工具
C++指向数组元素的指针
在C++中,一个变量有地址,一个数组包含若干元素,每个数组元素都在内存中占用存储单元,它们都有相应的地址;指针变量既然可以指向变量,也可以指向数组元素,所谓数组元素的指针就是数组元素的地址。
小林C语言
2020/12/15
2.2K0
C++指向数组元素的指针
c++的条件运算符_条件运算符都有哪些
表达式1是 :t_Unit == "无单位" 表达式2是:"" 表达式3是:t_Unit 也就是说: 如果i_Uint=="无单位"为真,m_sUnit的返回值就是""; 如果i_Uint=="无单位为假,m_sUnit的返回值就是t_Unit的值
全栈程序员站长
2022/11/10
4810
Fabric.js 复制粘贴元素
当你要复制一个 fabric 的元素时,你考虑到的是什么?是深拷贝当前选中对象再添加到画布中?
德育处主任
2023/06/10
7250
Fabric.js 复制粘贴元素
C++ 条件变量使用详解
在C++11中,我们可以使用条件变量(condition_variable)实现多个线程间的同步操作;当条件不满足时,相关线程被一直阻塞,直到某种条件出现,这些线程才会被唤醒。
C语言与CPP编程
2022/10/31
2.9K0
C++ 条件变量使用详解
按照元素指定条件筛选结构体数组
这篇博客: https://xuzhiwei.blog.csdn.net/article/details/102836602
演化计算与人工智能
2020/08/14
5860
C++迭代和条件判断
for语句有两种形式:传统for语句和范围for语句。 (1)传统for语句的一般形式如下:
用户7886150
2021/02/10
5740
Golang MongoDB Driver 更新符合条件的数组元素的字段
在 MongoDB 的 Shell 里修改文档里某个符合条件的数组里的值的字段,可以这样:
饶文津
2020/08/05
4.1K0
C++, Java, Python 中的浅复制
对象的浅复制,深复制问题,在面试中经常被问到,不管是 C++, Java, 还是 Python,一般都会问这个问题。今天以Python为例来说明浅复制问题。
double
2019/10/22
5320
点击加载更多

相似问题

C++矢量复制元素?

23

矢量的矢量复制不正确(C++)

11

C++中的矢量复制

31

避免c++矢量复制

18

复制特定的矢量部件c++

11
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文