C++ 查找数组中某些元素的大小?

C++ 查找数组中某些元素的大小?,c++,arrays,string,sizeof,C++,Arrays,String,Sizeof,如何找到数组中已确定成员的大小。例如,我用以下命令声明了我的数组: string myStrArray[200] = { "My first string", "My second string", "My last string" } 在这段代码中,有197个未使用的元素(我也这么理解)。我想通过sizeof()之类的代码找到这个数组的某些元素(3个元素)。我该怎么做?你不能。但是,可以先将数组归零,然后计算非零元素的数量,但这需要数组包含string*而不是stri

如何找到数组中已确定成员的大小。例如,我用以下命令声明了我的数组:

string myStrArray[200] = {
    "My first string",
    "My second string",
    "My last string"
}

在这段代码中,有197个未使用的元素(我也这么理解)。我想通过sizeof()之类的代码找到这个数组的某些元素(3个元素)。我该怎么做?你不能。但是,可以先将数组归零,然后计算非零元素的数量,但这需要数组包含
string*
而不是
string

您可以改用向量,例如:

std::vector<std::string> v;
v.reserve(200); // Allocate space for 200
v.push_back("My first string");
v.push_back("My second string");
v.push_back("My last string");
v.size(); // Returns 3
std::vector v;
v、 保留地(200);//为200人分配空间
v、 向后推(“我的第一根弦”);
v、 向后推(“我的第二根弦”);
v、 向后推(“我的最后一串”);
v、 大小();//返回3

> > P> >至少没有C++(我所知道的)来读取数组中有多少元素被确定。您必须通过自己的变量来实现(在“添加”元素时递增,在“删除”元素时递减)。还可以使用std::vector。vector.size()返回向量的大小。

如果确定所有非空字符串都在开头,则可以使用
std::find

int n = std::find(myStrArray, myStrArray + 200, "") - myStrArray;
实际上,您可以使用
std::lower_bound
,这是一种二进制搜索,因此比
std::find
更有效。但你需要一个奇特的比较函数。如果lhs为非空且rhs为空,则返回true,否则返回false

如果非空元素分布稀疏,则需要使用
std::count

int n = 200 - std::count(myStrArray, myStrArray + 200, "");
您不能使用sizeof()来确定数组中“填充”了多少个元素,您正在数组中存储std::string(我假设至少),并且所有元素的大小都相同(因为std::string在初始化后不会改变大小)。在C++中没有对象改变大小实际上至少不是根据siZeFe();sizeof()将始终为类型返回相同的数字,因为它返回静态类型的大小

如果你认为数组中的一个位置在字符串不等于“”时被“填充”,那么你可以使用下面的代码来计算字符串的数量:

for (int i = 0; i < 200; ++i)
    if (!myStrArray[i].empty()) ++count;
for(int i=0;i<200;++i)
如果(!myStrArray[i].empty())++计数;
不过,我建议使用std::vector(这几乎总是一个更好的主意):

std::vector my_strings={“a”,“b”};//在C++03中需要C++11使用push_back()

如果所有元素都被使用,只有最后197个元素是空的。你想要什么,这些元素的索引?或者可以假设他们永远是第一个吗?有很多方法。您只需检查是否有与
相等或不相等的元素。它只适用于新创建的数组。如果它被多次编辑,这个方法就不是最好的。除此之外,它还具有线性复杂性。第一行是错误的。无需在RHS上安装新的
。调用变量
vector
是自找麻烦@juanchopanza你是对的。谢谢你指出这一点。复制和粘贴失败。@CharlesBailey您是对的。正如我上面提到的,这是一次复制粘贴失败,但感谢您指出这一点。@RondogiannisAristophanes您是对的。我已经澄清了答案的那一部分,说它没有回答原始问题的那一部分。@akton您可以使用
reserve
功能。当你写
v.reserve(200)它分配空间来容纳200个
string
s
std::vector<std::string> my_strings = { "a", "b" }; // requires C++11 in C++03 use push_back()
std::cout << "Number of strings: " << my_strings.size() << std::endl;