基于条件从vector复制元素
Copy elements from vector based on condition C++
我正在使用c++创建Hopcroft的DFA最小化算法。
Hopcroft算法的一部分是-初始-划分两个集合(p有接受和不接受状态,Q只有不接受状态)。我已经有了P组,我试图从P中提取Q.我使用以下代码来做:
for(int i=0; i<groupP.size(); i++)
if(groupP[i]->final)
groupQ.push_back(groupP[i]);
,其中groupP和groupQ为:
vector<node*> groupQ;
vector<node*> groupP;
and node是我创建的一个结构,用来表示自动机的一个节点。它保证布尔属性"final"已经被正确设置(非最终状态为false,最终状态为true)。
最后,我的问题是:通过我所做的,将一个元素从向量复制到另一个元素是正确的吗?如果我修改了从groupP复制的元素的内容,是否也会在groupQ中修改相同的元素?
现在,你有指针的向量。从一个向量复制到另一个向量时,复制的是指针,而不是元素本身。
由于有两个指针指向同一个节点,因此对一个节点所做的任何修改都将在另一个组中可见。,如果您更改了groupP[i]->foo
,那么同样的更改将在groupQ[j]->foo
中可见(前提是groupP[i]
是您从groupP
复制到groupQ
的元素之一)。
如果你不想这样,你有几个选择。一种方法是将groupP
和groupQ
保留在同一个vector中,但是根据元素的final
成员的状态划分vector:
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
中各有一个元素。其中任何一个都可以被修改,但是它们彼此是分开的,所以任何一个都可以被修改,但是对其中一个的修改对另一个没有影响。
实现这一目标最明显的方法是使用节点向量:
vector<node> groupQ;
vector<node> groupP;
这样,当您从一个组复制到另一个组时,您复制的是节点本身,而不是指向节点的指针,因此每次复制都会创建一个与现有节点具有相同值的新的独立节点。
你可以使用std::copy_if来做同样的事情:
std::copy_if(groupP.cbegin(), groupP.cend(),
std::back_inserter(groupQ),
[](node* n){ return n->final; });
由于操作的是指针,因此元素本身是共享的,因此在一个容器中修改节点可以从另一个容器中看到。
请注意,像您这样操作原始指针是非常容易出错的,您可能希望使用共享指针。
编辑:添加丢失的std::back_inserter
。
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 使用赋值运算符复制 std::vector
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- 将 Vector<String > 元素复制到其他 Vector<String>* (1 作为
- push_back std::vector,则重复调用复制构造函数
- 如何使用 CUDA 将 std::vector<std::string> 复制到 GPU 设备
- 双重调用传递给 std::vector::emplace_back 的类的复制构造函数
- std::vector 是否有用于引用的复制构造函数?
- 如何禁用Visual Studio警告C4244,用于std::vector复制或使用隐式缩小转换进行赋值
- 根据条件将元素从 std::vector 复制到 std::set 但它崩溃了
- 将数据从 std::vector 复制到 Eigen's MatrixXd in C++
- 将std :: vector复制到std :: array
- 仅在发布版本中出错,从 std::vector 复制结构
- 将std::vector复制到qvector
- 如何将boost::numeric::ublas::vector复制到矩阵
- c++ vector复制赋值,调用其元素的复制机制
- 有趣的std::从std::vector复制到std::string的行为
- 使用memcpy将std::vector复制到protobuf中的重复字段
- 将 std::map<int, vector> 复制到 std::<int>map<std:string, vector<int>>
- 基于条件从vector复制元素