在类构造函数中拆分字符串
Posted
技术标签:
【中文标题】在类构造函数中拆分字符串【英文标题】:Split a string inside a class constructor 【发布时间】:2014-11-19 08:12:18 【问题描述】:我有一个包含 2 个数据成员的类:大小和一个整数数组(动态分配)。该类的目的是创建一个大小的数组并用值填充它。任务是创建一个以字符串为参数的构造函数,但字符串看起来像这样:“12|13|14|15”等。我已经搜索过了,但所有解决方案都有点太复杂了,因为它们涉及向量,我们还没有从向量开始。我基本上想将这些数字 1 x 1 放入整数数组中,并找出数组的大小。我怎样才能做到这一点?我尝试弄乱 getline 和 stringstream 但这给了我很多错误。我的代码如下所示。
#include <string>
#include <iostream>
#include <sstream>
using namespace std;
class IntArrays
private:
static int objcount;
int size;
public:
int *arrayints;
const static int objcountf();
IntArrays(int);
IntArrays(const IntArrays &p)
size = p.size;
for (int i = 0;i <size;i++)
arrayints[i] = p.arrayints[i];
IntArrays(std::string f)
// ignore the other constructors, this is the constructor that is giving me trouble
int counter =0;
istringstream inStream(f);
string newstring;
while (getline(iss,newstring, '|'))
arrayints[counter] = stoi(newstring);
counter++;
void enternums();
(note that this is only the header file, and that the current string constructor I have there does not work.
【问题讨论】:
你有你的指针arrayints
,但你从未初始化它。当您取消引用它时,这当然会导致 undefined behavior。
【参考方案1】:
此代码是我的版本。我更喜欢使用vector
而不是原始的array
。
类定义:
class IntArrays
public:
IntArrays(const string&, const char&);
const vector<int>& data() return _data;
const int size() return _data.size();
private:
vector<int> _data;
;
以下是构造函数实现:
IntArrays::IntArrays(const string& str, const char& delimiter)
string buff;
for(auto& n:str)
if(n != delimiter) buff+=n; else
if(n == delimiter && buff != "")
_data.push_back(stoi(buff));
buff = "";
if(buff != "") _data.push_back(stoi(buff));
然后我们只使用类:
IntArrays a("1|4|9|6|69", '|');
vector<int> da = a.data();
IntArrays b("1,4,9,6,69", ',');
vector<int> db = b.data();
【讨论】:
【参考方案2】:我将尝试对此进行递归 =p 抱歉,我无法提供 c++ 版本 =p.. 我猜这是一个java版本。
list parse(string data, list base)
if (data.length > 0)
string s = data.subStr(0,1);
if (s == "|")
base.push(0); //set the initial value for a new value
else
int i = parseInt(s);
int result = base.pop()*10 + i; //recalculate the result
base.push(result);
return parse(data.subStr(1),base); //recursion
else
return base; //return the result
【讨论】:
【参考方案3】:正如 Joachim 所指出的,您不需要初始化指针。不幸的是,在分配之前你没有数组的大小,所以你有几个解决方案:
两次处理输入(如果你有大量的条目真的很糟糕);在第一次通过时,计算输入。然后分配数组,然后再次读取,到分配的数组中。
将输入读入链表;列表中的每个元素都会保存一个值,以及下一个元素的地址。
预分配一块内存并希望它足够大以读取整个数组。如果不是,则重新分配一个更大的块并将已经读取的值复制到其中,然后丢弃初始块(这就是 std::vector 所做的)。
【讨论】:
以上是关于在类构造函数中拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章