在C++中如何计算字符串数组中的字符串数量?

8

如何对字符串数组中的字符串数量求和,而未明确定义它需要多少个元素?

string str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };

需要找出数组有多少个元素?

5个回答

10
template< typename T, size_t N >
/*constexpr*/ size_t size( T(&arr)[N]) )
{
   return N;
}

如果可用(C++11),constexpr将允许您使用返回值作为另一个数组的大小,以进行静态(编译时)使用。

最好将其设为constexpr - Konrad Rudolph
如果需要,T 将解析为 const。这将适用于 const 输入以及非 const。 - CashCow
@CashCow 但这永远不会使 size(x) 成为一个常量表达式。这意味着 int other_array[size(some_array)]; 将无效。如果将其设置为 constexpr,则它是一个常量表达式。 - R. Martinho Fernandes
1
不,应该是 constexpr size_t size( T(&arr)[N]) ) - R. Martinho Fernandes
我认为你现在可以安全地编辑constexpr了 - C++11现在得到广泛支持。 - anon
显示剩余2条评论

8
如果 str[] 是静态定义的(如所示),那么这样做可以正常工作:
const size_t numElements = sizeof(str) / sizeof(str[0]);

如果它是动态创建的,那么您需要一个“标记”来表示最后一个元素(如果是指针数组,则通常使用0)。或者调用者告诉您有多少个元素(这也很常见)。

我不明白...如果str[0]的长度与str[1]不同怎么办? - Lews Therin
@LewsTherin:显然,OP想知道数组有多少个元素;元素的长度并不重要。 - Frerich Raabe

3

除了其他答案中列出的方法外,另一种实现方式是在数组末尾添加一个守卫值,比如一个空字符串。然后你可以遍历数组直到找到守卫值。

个人建议使用C++11和

std::vector<std::string> la = { "foo", "bar", "baz" };

因此,在运行时,您可以只查询la.size()以获取所需内容...。但不幸的是,我没有看到如何在std::array中使用这个技巧,所以它并不是一个完美的替代方案。


2
@R.MartinhoFernandes 是的,但是你不能在类型定义中不提供数组长度的情况下初始化 std::array。而且我认为 OP 不想使用“首先确定数组中元素的数量”来解决“我的数组中有多少个元素”的问题。;-) - Rook

1

使用指针计算数组元素的一种方法:

#include <iostream>
using namespace std;

int main() {
    string str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
    cout << ((&str)[1] - str);  // 5
    cout << endl;
    return 0;
}

输出:
5

0

我通常使用一个单独的变量来跟踪数组大小。

String str[] = { "astring", "bstring", "cstring", "dstring", "zstring" };
int strNum = 5;

然后,如果我需要引用任何字符串,我只需调用它:

String foo = str[strNum-1];

每当我在循环中更新数组时,我只需使用strNum作为索引开始编写新字符串,然后在每个新字符串之后立即在循环中放置一个strNum++。


这种方法的缺点是两个变量互不关联。最终,当某人修改一个变量但不修改另一个变量时,它们将不同步。 - SirGuy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接