如何确定存储在数组中的项目数?

时间:2015-11-28 00:01:37

标签: c++ c++11

我有一个大小为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]);
}

4 个答案:

答案 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包含方法sizelength,它们返回字符串中的字符数。

例如,相对于您的代码段

array[0] = "pie";
array[1] = ":P";
array[2] = "YELLOW";

array[0].size()将返回3,

array[1].size()将返回2,

array[2],size()将返回6