我正在学习/练习对象数组和指向对象的数组,我对如何获得动态数组大小非常困惑。
我有这个:
private:
Client ** arr_client;
public:
static string members [];
然后使用来自以下静态字符串数组成员的标记化数据填充数组arr_client:
static string members[] = {"Jhon Perez 623 22 12 1998"
,"Louis Smith 199 02 12 1988"
,"Daniel Martinez 106 02 01 2010"};
void load(void){
arr_client = new Client * [(sizeof(members)/sizeof(string))*sizeof(Client)];
for (i = 0; i < (sizeof(members)/sizeof(string)); i++){
istringstream stream(members[i],ios_base::in);
stream >> name;
stream >> lastname;
stream >> aux;
id = atoi(aux.c_str());
stream >> date;
date.append(" ");
stream >> aux;
date.append(aux);
date.append(" ");
stream >> aux;
date.append(aux);
arr_client[i] = new Client(name,lastname,id,date);
}
}
现在,在对象数组已满后,我想循环遍历arr_client但我似乎无法找到实现它的方法。
我应该使用:for (int i =0; i < (sizeof(**arr_client)/sizeof(client)); i++)
或取前一个cal的大小并执行:
for (int i =0; i < (sizeof(members)/sizeof(string)); i++)
并完成它?对我来说看起来并不那么有用......但是我又是新人。
我也有很多问题:
如果我不知道动态合成对象数组的大小怎么办?就像在这种情况下,我建立在一个已知大小的数组。
如何计算其中有多少元素,以便循环使用?
我可以为arr_client使用std :: iterator吗?
任何提示都会非常感激=)
和......是的,我确实知道<vector>
这是优点,但从来没有伤害过这些情景。
答案 0 :(得分:1)
首先,我赞赏你在采用vector
之类的高级工具之前尝试学习基础知识。
没有干净可靠的方式去做你要求的事情。人们通常会在单独的变量中记住数组的大小,如下所示:
unsigned int num_strings=3;
static string members[num_strings];
如果确实想要在运行时确定数组的大小,可以使用模板来完成:
template<typename T, size_t N>
size_t arraySize( T(&)[N] )
{
return(N);
}
答案 1 :(得分:0)
如果我不知道动态合成对象数组的大小怎么办?就像在这种情况下,我建立在一个已知大小的数组。
如何计算其中有多少元素,以便我可以遍历它?
你总是需要知道尺寸。您必须将其与阵列一起保存,否则您无法安全使用它。这就是为什么你不应该使用动态数组,而是使用std::vector
或Boost.MultiArray等安全容器。
并且您不能使用sizeof
,因为sizeof
是编译时运算符。
我可以为arr_client使用std :: iterator吗?
每当需要迭代器时,您可以使用pointer_to_start
作为范围开始,并使用pointer_to_start + size
作为范围结束。
答案 2 :(得分:0)
如果我不知道动态分配数组的大小,该怎么办? 对象?就像在这种情况下,我建立在已知大小的阵列上。 如何计算其中有多少元素,以便我可以遍历它?
你做不到。指针不包含此信息。你应该以其他方式保留它。
我可以为arr_client使用std :: iterator吗?
没有。 std::iterator
是一个模板,您应该从中派生自定义迭代器类,以避免重新输入大量的typedef。但任何指针都是一个随时可用的随机访问迭代器。
我建议你阅读a good C++ book。我自己的投票是针对Lippmann的C ++ Primer。它会帮助您 真正的