- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
上周,我们创建了一个使用类和 vector 管理字符串集的程序。我能够 100% 完成这件事。这周,我们必须用简单的单链表替换我们用来存储类中字符串的 vector 。
该函数基本上允许用户声明空字符串集,以及只有一个元素的集。在主文件中,有一个 vector ,其元素是一个包含 setName 和 strSet(类)的结构。
这是我的问题:它处理类的复制构造函数。当我删除/注释掉复制构造函数时,我可以根据需要声明任意数量的空集或单个集,并毫无问题地输出它们的值。但我知道当我实现程序的其余部分时,我显然需要复制构造函数。当我保留复制构造函数时,我可以声明一个集合(单个集合或空集合)并输出它的值。但是,如果我声明第二个集合,并尝试输出前两个集合中的任何一个,则会出现段错误。此外,如果我尝试声明超过 2 个集合,我会得到一个段错误。任何帮助将不胜感激!!
这是我的代码,用于对所有内容进行非常基本的实现:
这是 setcalc.cpp:(主文件)
#include <iostream>
#include <cctype>
#include <cstring>
#include <string>
#include "strset2.h"
using namespace std;
// Declares of structure to hold all the sets defined
struct setsOfStr {
string nameOfSet;
strSet stringSet;
};
// Checks if the set name inputted is unique
bool isSetNameUnique( vector<setsOfStr> strSetArr, string setName) {
for(unsigned int i = 0; i < strSetArr.size(); i++) {
if( strSetArr[i].nameOfSet == setName ) {
return false;
}
}
return true;
}
int main() {
char commandChoice;
// Declares a vector with our declared structure as the type
vector<setsOfStr> strSetVec;
string setName;
string singleEle;
// Sets a loop that will constantly ask for a command until 'q' is typed
while (1) {
cin >> commandChoice;
// declaring a set to be empty
if(commandChoice == 'd') {
cin >> setName;
// Check that the set name inputted is unique
if (isSetNameUnique(strSetVec, setName) == true) {
strSet emptyStrSet;
setsOfStr set1;
set1.nameOfSet = setName;
set1.stringSet = emptyStrSet;
strSetVec.push_back(set1);
}
else {
cerr << "ERROR: Re-declaration of set '" << setName << "'\n";
}
}
// declaring a set to be a singleton
else if(commandChoice == 's') {
cin >> setName;
cin >> singleEle;
// Check that the set name inputted is unique
if (isSetNameUnique(strSetVec, setName) == true) {
strSet singleStrSet(singleEle);
setsOfStr set2;
set2.nameOfSet = setName;
set2.stringSet = singleStrSet;
strSetVec.push_back(set2);
}
else {
cerr << "ERROR: Re-declaration of set '" << setName << "'\n";
}
}
// using the output function
else if(commandChoice == 'o') {
cin >> setName;
if(isSetNameUnique(strSetVec, setName) == false) {
// loop through until the set name is matched and call output on its strSet
for(unsigned int k = 0; k < strSetVec.size(); k++) {
if( strSetVec[k].nameOfSet == setName ) {
(strSetVec[k].stringSet).output();
}
}
}
else {
cerr << "ERROR: No such set '" << setName << "'\n";
}
}
// quitting
else if(commandChoice == 'q') {
break;
}
else {
cerr << "ERROR: Ignoring bad command: '" << commandChoice << "'\n";
}
}
return 0;
}
这是 strSet2.h:
#ifndef _STRSET_
#define _STRSET_
#include <iostream>
#include <vector>
#include <string>
struct node {
std::string s1;
node * next;
};
class strSet {
private:
node * first;
public:
strSet (); // Create empty set
strSet (std::string s); // Create singleton set
strSet (const strSet ©); // Copy constructor
// will implement destructor and overloaded assignment operator later
void output() const;
}; // End of strSet class
#endif // _STRSET_
这里是 strSet2.cpp(类的实现)
#include <iostream>
#include <vector>
#include <string>
#include "strset2.h"
using namespace std;
strSet::strSet() {
first = NULL;
}
strSet::strSet(string s) {
node *temp;
temp = new node;
temp->s1 = s;
temp->next = NULL;
first = temp;
}
strSet::strSet(const strSet& copy) {
cout << "copy-cst\n";
node *n = copy.first;
node *prev = NULL;
while (n) {
node *newNode = new node;
newNode->s1 = n->s1;
newNode->next = NULL;
if (prev) {
prev->next = newNode;
}
else {
first = newNode;
}
prev = newNode;
n = n->next;
}
}
void strSet::output() const {
if(first == NULL) {
cout << "Empty set\n";
}
else {
node *temp;
temp = first;
while(1) {
cout << temp->s1 << endl;
if(temp->next == NULL) break;
temp = temp->next;
}
}
}
最佳答案
C++ 标准规定标准容器中使用的类型(例如 std::vector)必须是可复制构造和可赋值的。
由于您尚未在类 strSet 上实现自定义赋值运算符,编译器将为您生成一个执行简单的成员复制的运算符。在您的情况下,这意味着将直接复制“第一个”指针。显然,这意味着两个对象现在“拥有”集合中的节点,并且当它被释放两次时您会遇到崩溃。
一些提示:
实现自定义赋值运算符,其作用与复制构造函数相同
阅读有关通过引用传递对象的内容,并在可能的情况下通过 const 引用。当您按值传递时,您正在对容器和字符串进行大量不必要的复制。
例如
bool isSetNameUnique(const vector& strSetArr, const string& setName)
祝你好运:)
关于c++ - 需要复制构造函数的帮助以实现单链表的非常基本的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5319531/
我创建了一个单链表。一切正常。 我只想知道我是否在我的代码中做了任何有潜在危险的事情。我关心的代码片段是我的推送、弹出和清理。部分代码仅用于用户交互,因此并不重要(无论如何我都发布了它,以便更清楚地了
链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个程序运行时,内存分成五个区(
我最近开始专注于使用数据结构及其用例的编码练习。下面是我的程序,将数据插入到单个链表中,其中每个节点存储下一个节点的对象。这个程序运行良好。我想了解下面的代码有多有效,所遵循的逻辑是否有效且高效。当节
尝试编写一种方法,从单链表中删除某个值的所有实例,但它似乎不起作用。 我试图适应头部是否包含该值,但我不确定这是否是正确的方法: public void remove (int value) {
struct nodeStruct { int value; struct nodeStruct *next; } struct nodeStruct* List_createNode
typedef struct node { int data; struct node *next; } NODE; NODE* add_head(NODE **phead, int data) {
void addToEnd() { newnode = (struct node*)malloc(sizeof(struct node)); printf ("Enter the cu
我想编写一种方法,从单向链表中删除具有重复数据值的连续项。该方法应返回移除的项目数。该方法应根据需要清理内存,并应假定内存是使用 new 分配的。 比如传入列表 ->a->b->c->c->a->b-
我有一个存储播放列表的表。它的定义非常简单,只有三列: setID - 引用播放列表中的一行的 16 位十六进制 songID - 16 位十六进制数,引用我的歌曲表中的一行 nextID - 16
为什么我的代码不删除链表的最后一个元素?我创建了一个当前指针来横向穿过我的列表并跳出循环..(下一个是我的结构中名为 Card_Node 的点)。回答起来应该很简单,只是不确定为什么它不会删除列表中的
大家好,我现在正在为期中考试学习,正在努力尝试使用单链表创建一个简单的程序。我想让它做的就是将“1”、“2”、“3”、“4”插入列表并打印出来。请看下面的代码: #include #include
我想创建单链表(使用类),其中每个列表中都有:指向文本的指针、整数、指向下一个列表的指针。 我需要实现 3 个功能:插入(将列表插入单链表并根据指针指向的文本使用strcmp对元素进行排序)remov
我已经实现了一个单链表,我注意到了非常奇怪的行为,但无法查明它发生的确切原因。我已经尝试使用 gdb 找出问题所在,看起来每当我计算列表的大小时,事情就开始出错了。这是我用来测试我的实现的程序,下面是
我正在尝试找出一种从链表中间删除的算法.. 我的想法是遍历链表,找到我要删除的节点之前的节点,命名为Nprev,将Nprev设置为Nnext,其中Nnext在要删除的节点之后Ndelete。 所以 N
我正在尝试创建一个简单的单向链表。以前,我成功地做到了这一点,没有任何错误,但是现在我遇到了错误。我怀疑由于第 23 行中的 if 语句,内存分配存在某种问题。 我尝试过的: 我在我的所有声明中都使用
我正在尝试创建一个简单的单向链表。以前,我成功地做到了这一点,没有任何错误,但是现在我遇到了错误。我怀疑由于第 23 行中的 if 语句,内存分配存在某种问题。 我尝试过的: 我在我的所有声明中都使用
我在学习C++语言的同时尝试构建一个链表,并实现一个从最低到最高的节点插入功能。我遵循了互联网和教科书中的一些教程。 我有一个用于链表节点设置的结构: struct Node { private:
本文实例讲述了Python数据结构与算法之链表定义与用法。分享给大家供大家参考,具体如下: 本文将为大家讲解: (1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计 (2)链表
1561/1563 test cases passed 问题描述: You are given two non-empty linked lists representing two non-nega
我有一个任务来实现一个单链表。我试图找出如何获取头部,但最终出现堆栈溢出错误或空指针错误。有人可以帮助我吗?我已经显示了相关的代码片段: public class Llist { privat
我是一名优秀的程序员,十分优秀!