2组并集;返回简单对象-C++
union of 2 sets; return simple object - C++
实现以下功能的最佳方式是什么?我正试图找到两个集合的并集。我正在创建两个对象(一个叫set1,一个叫set 2)。我的目标是创建第三个对象,它是两者的UNION,而不必使用复制构造函数。必须使用动态内存分配、指针和/或引用。感谢任何人来解决这个困境,任何建议(并非双关语)都会有所帮助。
谢谢编码员。
HEADER文件
#ifndef INTEGERSET_H_
#define INTEGERSET_H_
class IntegerSet
{
private:
int * set;
int set_size;
public:
IntegerSet(int size); //default constructor
~IntegerSet(); //destructor
IntegerSet * unionOfSets(const IntegerSet & set2);
void insertElement(int k) const;
void printSet(int size) const;
};
#endif
主文件
#include <iostream>
#include "integerset.h"
using std::cout;
using std::endl;
int main()
{
IntegerSet set1(11);
//testing below
set1.insertElement(3);
set1.insertElement(4);
set1.insertElement(6);
set1.insertElement(10);
set1.printSet(11);
cout << endl;
IntegerSet set2(8);
set2.insertElement(3);
set2.insertElement(6);
set2.insertElement(7);
set2.printSet(11);
cout << endl;
IntegerSet * obj3 = new IntegerSet(11);
obj3 = set1.unionOfSets(set2);
obj3->printSet(11);
// system("pause");
return 0;
}
实现文件
#include "integerset.h"
#include <iostream>
IntegerSet::IntegerSet(int size)
{
set = new int[size];
set_size = size;
for (int i = 0; i < size; i++)
set[i] = 0;
}
IntegerSet::~IntegerSet()
{
delete [] set;
}
void IntegerSet::insertElement(int k) const
{
(*this).set[k] = 1;
}
void IntegerSet::printSet(int size) const
{
int temp = 0;
for (int i = 0; i < size; i++)
{
if (set[i] == 1)
{
std::cout << i << " ";
temp++;
}
}
if (temp == 0)
std::cout << "----";
}
IntegerSet * IntegerSet::unionOfSets(const IntegerSet & set2) //make this return the union of 2 sets; THIS and the passed ARG reference; return address
{
return this;
}
随机的早晨咆哮
您试图创建的与其说是std::set
,不如说是一个std::bitset
。集合通常是"定义良好的不同对象的集合">(Cantor的定义有点复杂,但让我们坚持这一点)。因此,一个集合可以包含几个成对不相关的对象。
说完这些之后,我们再来看看std::bitset
。注意,它的大小是由模板参数N
固定的。除了抛出std::out_of_range
之外,std::bitset::set
几乎等同于您的IntegerSet::insertElement
。这我建议你检查你的索引有效的位置:
void IntegerSet::insertElement(int k) const
{
if( k < 0 || k >= set_size)
throw std::out_of_range;
else
this->set[k] = 1;
}
然而,std::bitset
不支持工会,所以是时候解决你的问题了。
IntegerSet::unionofSets
看看那些线条。
IntegerSet * obj3 = new IntegerSet(11);
obj3 = set1.unionOfSets(set2);
第一行用指针初始化obj3
,该指针包含新创建的内部集大小为11的IntegerSet的内存。在下一行,你把球扔了。所以你在浪费资源,造成内存泄漏。
如果你要创建一个新的IntegerSet,你的解决方案会很简单:
IntegerSet IntegerSet::unionOfSets(const IntegerSet & set2) const
{
IntegerSet tmp (std::max(set2.set_size, this->set_size));
for(int i = 0; i < set_size; ++i)
tmp.set[i] = this->set[i];
for(int i = 0; i < set2.set_size; ++i)
tmp.set[i] |= set2.set[i];
return tmp;
}
但是您的实现更改了调用它的对象,所以它不是const
,而且有点不同:
IntegerSet * IntegerSet::unionOfSets(const IntegerSet & set2) // not const!
{
if(set2.set_size > set_size){
// the resulting set is bigger, we need new memory
int * newset = new int[set2.set_size];
// copy old values
for(int i = 0; i < this->set_size; ++i)
newset[i] = this->set[i];
// replace old size
this->set_size = set2.set_size;
delete[] this->set; // remove old data
this->set = newset; // replace pointer
}
for(int i = 0; i < set2.set_size; ++i)
this->set[i] |= set2.set[i];
return this;
}
这应该足够了。请记住,您不能使用new IntegerSet
来创建联合:
IntegerSet * obj3 = new IntegerSet(11); // new memory, lets say obj3 = 0x500a
obj3 = set1.unionOfSets(set2); // new memory gone forever
if(obj3 == &set1)
std::cout << "obj3 is a pointer to set1, changes to obj3 will affect set1" << std::endl;
如果您不想创建这种行为,请使用带有临时的第一个版本。
此外,请检查std::set<int>
是否足够,因为您可以从<algorithm>
使用std::set_union
。
编辑
- 提供一个unionOfSets成员函数,该函数创建第三个IntegerSet,该IntegerSet是两个现有IntegerSet实例的并集(因此,此函数创建的第三个集包含用于创建它的两个集中的所有成员-因此,如果对其中一个或两个集执行并集操作时都有元素,则第三个集合将有该元素)
在这种情况下,忘记IntegerSet * IntegerSet::unionOfSets(const IntegerSet&)
,使用IntegerSet IntegerSet::unionOfSets(const IntegerSet&) const
(第一个带有返回对象而不是返回指针的变体)。
编辑2
由于您没有遵循三规则,返回的IntegerSet
中的内存将无效。为了解决此问题,您必须实现一个复制构造函数/赋值运算符,或者提供一个具有动态存储持续时间的新对象(new
)。为此,您只需要稍微调整一下方法:
IntegerSet * IntegerSet::unionOfSets(const IntegerSet & set2) const
{
IntegerSet * tmp = new IntegerSet( set2.set_size > this->set_size ? set2.set_size : this->set_size);
for(int i = 0; i < set_size; ++i)
tmp->set[i] = this->set[i];
for(int i = 0; i < set2.set_size; ++i)
tmp->set[i] |= set2.set[i];
return tmp;
}
使用标准设施。。。
std::vector
比手动滚动阵列更好- CCD_ 20和CCD_
因此:
std::vector<int> set1;
set1.push_back(1); // ... and others
std::sort(set1.begin(), set1.end()); // sorts
std::unique(set1.begin(), set1.end()); // removes duplicates
// same with set2
std::vector<int> set3(set1);
set3.insert(set3.end(), set2.begin(), set2.end());
std::sort(set1.begin(), set1.end()); // sorts
std::unique(set1.begin(), set1.end()); // removes duplicates
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 使用链表 C++ 的简单工资单系统
- 如何使用鼠标单击选择多个 QLabel 对象?
- 类的方法和对象。参考?智能指针?简单的初始化?
- 有没有一种简单的方法可以在对象向量上调用构造函数?
- 鼠标单击 OpenGL 时无法围绕其自己的中心旋转对象
- 为什么我们需要创建一个单参数构造函数来使用临时的无名称对象
- "std::function"的简单版本:函数对象的生存期?
- OpenGL - 每次单击菜单时移动的对象
- 带有抛入 ctor 的对象的单例 - 再次访问?
- 面向对象架构,用于简单的基于着色器的GL程序
- 如何将项目共享"system calls"作为单例对象构建和链接到引导加载程序?
- 模拟单击"Choose" QFileDialog 对象中的按钮
- 是否有一种简单的方法可以在运行时在C 中创建/名称对象
- 使用本机/C++代码在VS2010中创建简单COM对象的最简单方法是什么
- 单个多对象卡尔曼滤波器与多个单对象卡尔曼滤波器(多个)
- OpenCV C++简单的对象跟踪
- 如何实现表单对象的搜索
- 我的 QNX/BB10 C++应用程序崩溃,一个简单的C++对象似乎已损坏
- 简单指针对象错误C++