У меня есть класс с двумя членами данных: size и массив ints (динамически распределенный). Целью класса является создание массива размера и заполнение его значениями. Задача состоит в том, чтобы создать конструктор, который берет строку в качестве своего параметра, но строка выглядит так: "12 | 13 | 14 | 15" и т.д. Я искал это, но все решения являются слишком сложными, поскольку они включают векторов, и мы еще не начали с векторов. Я в основном хочу поместить эти числа в массив ints, 1 на 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.
Этот код - моя версия. Я предпочитаю использовать 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();
Как указал Йоахим, вы не инициализируете указатель. К сожалению, у вас нет размера массива перед распределением, поэтому у вас осталось несколько решений:
обрабатывать ввод дважды (очень плохо, если у вас большое количество записей); На первом проходе подсчитайте входные данные. Затем выделите массив, а затем прочитайте их снова, в выделенный массив.
читать входы в связанный список; Каждый элемент в списке будет содержать значение и адрес следующего элемента.
Предварительно выделите блок памяти и надейтесь, что он достаточно большой, чтобы прочитать весь массив. Если это не так, перераспределите больший блок и скопируйте в него уже прочитанные значения, затем отбросьте начальный блок (это то, что делает std :: vector).
Я попытаюсь получить рекурсию для этого = 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
}
}
arrayints
, но вы никогда не инициализируете их. Это, конечно, приводит к неопределенному поведению, когда вы обращаетесь к нему.