我有一个大小为5
的字符串数组,其中包含n
个元素。我怎样才能确定n
?我尝试了sizeof(array)/sizeof(array[0])
,但它返回了数组的大小,即5
。我的代码是:
#include <iostream>
#include <string>
using namespace std;
int main()
{
string array[5];
array[0] = "pie";
array[1] = ":P";
array[2] = "YELLOW";
cout << sizeof(array)/sizeof(array[0]);
}
答案 0 :(得分:9)
我有一个大小为
5
的字符串数组,其中包含n
个元素。我怎样才能确定n
?
n
是5.你的数组有5个元素,因为你声明它是一个包含5个字符串的数组。 array[3]
和array[4]
只是空字符串(""
),但它们仍然存在,并且完全有效。
如果你想计算你的数组有多少非空字符串,你可以使用例如std::count_if
与lambda:
int numberOfNonEmptyStrings = count_if(begin(array), end(array),
[](string const& s) { return !s.empty(); });
或手工制作的循环:
int numberOfNonEmptyStrings = 0;
for (auto const& s : array)
if (!s.empty())
++numberOfNonEmptyStrings;
答案 1 :(得分:6)
内置数组(称为原始数组)不支持动态长度。它有一个固定的长度。对于声明的数组,可以通过多种方式找到固定长度,包括您使用的非常安全的C语言。
来自标准库(标题std::vector<
)的 >
Itemtype <vector>
管理原始数组和动态长度。而这显然正是你所需要的。内部数组(称为向量“缓冲区”)会根据需要自动替换为较大的数组,因此您甚至不需要预先指定容量 - 您只需向向量添加项目即可。
通常通过名为push_back
的方法向向量添加项目,并且通常通过size
方法查找当前项目数 length ,像这样:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> a;
a.push_back( "pie" );
a.push_back( ":P" );
a.push_back( "YELLOW" );
cout << a.size() << endl;
}
但由于std::vector
支持通过大括号初始化列表进行初始化,因此您不必对已知的初始项使用push_back
:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> a = { "pie", ":P", "YELLOW" };
cout << a.size() << endl;
}
最后一项改进是使用const
,如果它不打算更改该向量。这使得更容易推理代码。使用const
,您可以预先看到以下所有代码都不会更改此向量,因此您可以确定它在任何时候提供的值:
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main()
{
vector<string> const a = { "pie", ":P", "YELLOW" };
cout << a.size() << endl;
}
免责声明:编译器手上没有触及的代码。
如果你真的想要一个固定大小的数组,最好使用std::array<
Itemtype >
。它适用于基于范围的循环。并且它有一个size
方法,就像矢量一样,所以你可以这样做:
#include <algorithm> // std::count
#include <iostream>
#include <string> // std::string
#include <array> // std::array
using namespace std;
int main()
{
array<string, 5> const a = { "pie", ":P", "YELLOW" };
cout << "Fixed size: " << a.size() << endl;
int const n_empty = count( begin( a ), end( a ), "" );
cout << "Non-empty strings: " << a.size() - n_empty << endl;
}
答案 2 :(得分:2)
您需要创建一个变量,其中包含您目前存储的字符串数量的值,并在存储字符串时更新该变量。
或者你可以使用标准容器而不是C风格的数组:
#include <vector>
// ... in main
vector<string> array;
array.push_back("pie");
array.push_back(":P");
array.push_back("YELLOW");
cout << array.size() << '\n';
答案 3 :(得分:0)
标准类std::string
包含方法size
和length
,它们返回字符串中的字符数。
例如,相对于您的代码段
array[0] = "pie";
array[1] = ":P";
array[2] = "YELLOW";
array[0].size()
将返回3,
array[1].size()
将返回2,
array[2],size()
将返回6