我不擅长 C/C++,所以这个答案只会很笼统。除非您非常关心速度或内存优化(大多数情况下您不应该如此),否则请使用封装。
做一堂课。制作一个界面,说明您想要做什么。尽可能简单地实现如何做到这一点。大多数时候,最简单的实现就足够了,除非它包含一些错误。
让我们从界面开始。你本可以把它作为问题的一部分。对我来说,您似乎想要一个类似于字符串的二维数组,其中一个维度只允许值 0 和 1,而另一个维度允许任何非生成整数。
只是为了确保没有误解:有界维度总是大小为 2(最多不是2),对吧?所以我们基本上是在谈论 2×N 的“矩形”字符串。
你需要什么方法?我的猜测:一个新的 2×0 大小矩形的构造函数。一种附加一对新值的方法,它将矩形的大小从 2×N 增加到 2×(N+1) 并设置两个新值。一种返回矩形当前长度的方法(只有无界维度,因为另一个是常数)。以及一对通过坐标读取或写入单个值的随机访问方法。这就是全部?
让我们编写接口(对不起,我不擅长 C/C++,所以这将是一些 C/Java/pseudocode 混合)。
class StringPairs {
constructor StringPairs(); // creates an empty rectangle
int size(); // returns the length of the unbounded dimension
void append(string s0, string s1); // adds two strings to the new J index
string get(int i, int j); // return the string at given coordinates
void set(int i, int j, string s); // sets the string at given coordinates
}
如果索引超出范围,我们应该指定函数“set”和“get”会做什么。为简单起见,假设“set”什么都不做,而“get”将返回 null。
现在我们准备好了问题。让我们来看看答案。
我认为编写这个类的最快方法是简单地将现有的 C++ 类用于一维向量(我不知道它是什么以及它是如何使用的,所以我只是假设它存在,并且会使用一些伪代码;我将其称为“StringVector”)并执行以下操作:
class StringPairs {
private StringVector _vector0;
private StringVector _vector1;
private int _size;
constructor StringPairs() {
_vector0 = new StringVector();
_vector1 = new StringVector();
_size = 0;
}
int size() {
return _size;
}
void append(string s0, string s1) {
_vector0.appens(s0);
_vector1.appens(s1);
_size++;
}
string get(int i, int j) {
if (0 == i) return _vector0.get(j);
if (1 == i) return _vector1.get(j);
return null;
}
void set(int i, int j, string s) {
if (0 == i) _vector0.set(j, s);
if (1 == i) _vector1.set(j, s);
}
}
现在,将此伪代码转换为 C++,并添加您需要的任何新方法(应该很明显如何)。
使用现有类来构建新类可以帮助您更快地编程。如果您以后改变主意,您可以在保留接口的同时更改实现。