计算对象数组的元素(大小)

时间:2011-08-04 19:25:05

标签: c++ arrays dynamic-arrays

我正在学习/练习对象数组和指向对象的数组,我对如何获得动态数组大小非常困惑。

我有这个:

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>这是优点,但从来没有伤害过这些情景。

3 个答案:

答案 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。它会帮助您 真正的