level 8
本人通过重载vector实现了C++模仿Pascal数组。
这里先贴出源代码:
template <typename elemType, int left, int right>
struct PArray : public vector<elemType>
{
PArray() : vector<elemType>(right-left+1) { }
elemType &operator[] (int sub)
{
return vector<elemType>::operator[](sub-left);
}
};
这里只是重载了vector的下标,其实at()函数也可以使用类似的方法。另外构造函数也只是简单的写了一个。
实际编程的时候可以不必写成模板的样子,只是重载成所需的成员类型即可。
2011年11月20日 12点11分
3
level 8
哦对了,使用时一定记得包含<vector>。
给两个实例:
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int main ()
{
PArray<int, -2, 2> arr1; // 类似 "var arr1: array[-2..2] of integer"
arr1[-2] = 100;
arr1[-1] = 16;
arr1[0] = 1000;
arr1[1] = 87;
arr1[2] = 10000;
for (int i=-2; i<=2; ++i)
cout << arr1[i] << ' ';
cout << endl;
// 输出: 100 16 1000 87 10000
PArray<string, 'a', 'e'> arr2; // 类似 "var arr2: array['a'..'e'] of string"
arr2['a'] = "I";
arr2['b'] = "love";
arr2['c'] = "OI";
arr2['d'] = "and";
arr2['e'] = "NNEZ";
for (char i='a'; i<='e'; ++i)
cout << arr2[i] << ' ';
cout << endl;
// 输出: I love OI and NNEZ
return 0;
}
好了,估计这缩进又是给吃掉的,勉强大家了。
2011年11月20日 12点11分
5
level 8
说明一下,5L其实开始还有一段3L的代码省略掉了,大家自己补上。
2011年11月20日 13点11分
7
level 8
Pascal的内置数组下标很灵活,任意整数或者字符都可以。其实C++也可以通过上述的小技巧做到。
考虑到map效率较低,因此重载vector也不算太麻烦。
2011年11月20日 13点11分
11
level 1
不用vector的话,重载方括号操作符需要返回引用才可。
曾经想过用可变参数实现任意多维数组,不过没尝试过…
2011年11月20日 13点11分
13
level 5
我觉得那样用大好啊,清晰明了。指针本身不危险。危险是因为用错了,就像数组本身很正常,你要越界的下标访问不就相当于用指针乱指了。
2011年11月20日 13点11分
14
level 9
我只想知道linux会报错么,linux判断数组下标无比蛋疼
2011年11月20日 14点11分
16
level 1
为什么不int memo[1000], *array = memo + 500;然后array[-1]什么的随便用啊。
没太明白用vector的意义,印象里这些东西就是为TLE设计的。
2011年11月20日 14点11分
17
level 9
不明白用vector的意义,说明您还只是把C++当做脚本语言来用。
2011年11月20日 15点11分
18
level 8
感觉这个的意义就是让楼主熟练了vector和重载的语法……
2011年11月20日 15点11分
19
level 9
iterator a=v.begin();
iterator z=v.end();
for(iterator i=a;i<=z;i++)cout<<i;
都以假乱真了
2011年11月20日 15点11分
20