在C ++中,字符串数组是否需要最大尺寸?

时间:2018-12-15 21:47:11

标签: c++ arrays string

我是否需要声明数组的最大尺寸,或者在添加项目时是否有办法使数组缩放?

2 个答案:

答案 0 :(得分:2)

每个数组都有固定的大小,这是其类型的一部分,无法更改:

#include <cstddef>

int main() 
{ 
  const std::size_t sz = 5;
  int iarr[sz];
  return 0;
}

在这里,数组的大小为5,这意味着它最多容纳5个元素。尝试添加更多未定义:

iarr[5] = 10; // undefined 

尽管行为是不确定的,但如果您尝试分配越界,编译器将不会阻止您。因此,您需要以一种避免这种情况的方式来构造代码:

for (std::size_t i = 0; i != sz; ++i)
{
  iarr[i] = 10;
}

此代码完全合法,很可能是您通常想要的。但是,如果您使用的是C ++ 11或更高版本,则可以使用基于范围的for循环,并使编译器担心大小:

for (auto &elm : iarr)
{
  elm = 10;
}

此示例完全相同。

话虽如此,最佳实践可能是始终使用std::vector。使用矢量对象,您不必担心容器的大小,而可以继续添加元素:

#include <vector>

int main() 
{
  std::vector<int> ivec;

  for (std::size_t i = 0; i != 5; ++i) // you may replace 5 any with non-negative integer
  {
    ivec.push_back(10);
  }
  return 0;
}

收集了所有必要的元素之后,再次使用基于范围的for循环很容易地遍历vector对象以查看其所有元素:

#include <iostream>
#include <vector>
#include <string>
#include <cstddef>

int main() 
{
  std::vector<std::string> svec;

  for (std::size_t i = 0; i != 5; ++i)
  {
    svec.push_back("hello");
  }

  for (const auto &elm : svec)
  {
    std::cout << elm << std::endl;
  }

  return 0;
}

输出:

hello
hello
hello
hello
hello

答案 1 :(得分:0)

数组具有在编译时确定的固定大小。因此,是的,如果您使用数组,那么您将需要提出一些可能不会被超出但同时又不会不必要地过多的元素。尽管仔细研究可能的用例和数据集来估计上限是有用的,但是通常很难得出一个硬上限,因为没有人看到未来。

此外,您还必须跟踪实际占用的元素数量,并且由于通常无法完全确定任何实际的上限,因此仍然必须检查是否超出了数组大小。

因此,建议使用std::vector来跟踪其元素的数量并根据需要分配新的内存。