在类构造函数中拆分字符串

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 所做的)。

【讨论】:

以上是关于在类构造函数中拆分字符串的主要内容,如果未能解决你的问题,请参考以下文章

在类的构造函数中返回值

如何在类构造函数中等待异步操作? [复制]

如何在类的成员函数中调用复制构造函数?

在类中定义多个构造函数

我的枚举在类构造函数中变为 null 是不是有原因?

在类构造函数线程中启动 std::thread 是不是安全?