Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在c+中查找字符串数组中的元素数+;?_C++ - Fatal编程技术网

C++ 如何在c+中查找字符串数组中的元素数+;?

C++ 如何在c+中查找字符串数组中的元素数+;?,c++,C++,我有一个字符串数组 std::string str[10]={“一”、“二”} 如何查找str[]数组中存在多少字符串??是否有任何标准函数?尽管您只初始化了其中的两个字符串,但其中有十个字符串: #include <iostream> int main (void) { std::string str[10] = {"one","two"}; std::cout << sizeof(str)/sizeof(*str) << std::endl

我有一个字符串数组

std::string str[10]={“一”、“二”}

如何查找
str[]
数组中存在多少字符串??是否有任何标准函数?

尽管您只初始化了其中的两个字符串,但其中有十个字符串:

#include <iostream>
int main (void) {
    std::string str[10] = {"one","two"};
    std::cout << sizeof(str)/sizeof(*str) << std::endl;
    std::cout << str[0] << std::endl;
    std::cout << str[1] << std::endl;
    std::cout << str[2] << std::endl;
    std::cout << "===" << std::endl;
    return 0;
}
如果要计算非空字符串,请执行以下操作:

#include <iostream>
int main (void) {
    std::string str[10] = {"one","two"};
    size_t count = 0;
    for (size_t i = 0; i < sizeof(str)/sizeof(*str); i++)
        if (str[i] != "")
            count++;
    std::cout << count << std::endl;
    return 0;
}
#包括
内部主(空){
std::string str[10]={“一”、“二”};
大小\u t计数=0;
对于(大小i=0;istd::cout您始终可以使用
countof
宏来获取元素数,但同样,内存分配给10个元素,这就是您将获得的计数。

实现这一点的理想方法是

std::string str[] = {"one","two"}

int num_of_elements = sizeof( str ) / sizeof( str[ 0 ] );
既然你知道尺寸。 您可以对notnull/empty进行二进制搜索

str[9]为空
str[5]为空
str[3]不是空的
str[4]为空
您有4项。


我真的不想实现代码,但这会很快。

如果你想计算所有元素的数量
sizeof
技术会像其他人指出的那样工作。 如果要计算所有非空字符串,这是一种可能的方法,可以使用标准的
count\u If
函数

bool IsNotEmpty( const std::string& str )
{
    return !str.empty();
}


int main ()
{
    std::string str[10] = {"one","two"};

    int result = std::count_if(str, &str[10], IsNotEmpty);
    cout << result << endl; // it will print "2"

    return 0;
 }
bool IsNotEmpty(const std::string&str)
{
return!str.empty();
}
int main()
{
std::string str[10]={“一”、“二”};
int result=std::count_if(str,&str[10],IsNotEmpty);

cout只需将此函数用于1D字符串数组:

template<typename String, uint SIZE>  // String can be 'string' or 'const string'
unsigned int NoOfStrings (String (&arr)[SIZE])
{
  unsigned int count = 0;
  while(count < SIZE && arr[count] != "")
    count ++;
  return count;
}

我只是想知道我们是否可以为这个模板编写一个模板元程序(因为编译时都是已知的)

< p>我不知道我会使用一组STD::Studio。如果你已经使用了STL,为什么不考虑一个向量或列表?至少这样你可以用STD::vector::同样,如果数组存储在堆上而不是堆栈上,那么这个大小的魔法也不会起作用

只要这样做:

std::vector<std::string> strings(10);
strings[0] = "one";
strings[1] = "two";

std::cout << "Length = " << strings.size() << std::endl;
std::向量字符串(10);
字符串[0]=“一”;
字符串[1]=“两个”;

std::你的意思是非空字符串吗?不,你可以这么说……因为现在只有两个字符串。你可以在运行时找到它。请看我下面的答案。我想知道它是否可以在编译时发生。是的。但是当我运行循环时,我怎么知道我只需要循环两次呢?你可以将元素与
null
string,这就是停止循环的时候不要只运行两次。运行10次,跳过底层字符串为空的部分。抱歉,伙计。有三个问题。1.为什么要一直计算字符串中有多少个元素。如果有10000000个订单N.真的持续,为什么不返回大小t。你的代码很容易超过un.计数的类型应与for迭代器的类型相同。@baash05:(1)如果愿意,您可以手动缓存该值,但是,除非您的编译器完全死机,否则它将已经在这样做了。(2)没关系。除非你确定所有的空字符串都在末尾,否则你必须查看每个索引。如果你知道这个事实,你可以进行二进制搜索,但我可能会有一个不同的类来维护计数并在setter中对其进行调整(将non-null改为null->
count--
,null改为non-null->
count++
)。(3) 是的,错过了,将会改变。但是,如果你有那么多字符串,你会遇到比整数溢出更多的问题:-)他在构造函数中定义了数组的大小。因此,虽然你的代码在这里可以工作。str[10](根据他的代码)有10个字符串。都是空的。这就是我的意思。如果数组中间有空字符串,你不需要一直提供数组长度。如果我们有自己的插入,我们可以使用它,这样我们就可以保持数组的排序。直到它变成真正的瓶颈为止,我不会这么做。用于查找数组中的活动字符串。但是,对于查找大小来说,
vector
将是一个好主意,非常直接。啊,shoot必须开始阅读整个问题+注释。他总是可以使用向量,用字符串推回向量,然后只需执行vector.size().我不明白为什么只要他弹回来,他就会有不活动的字符串's@baash05:如果知道第一个空元素分隔了正在使用的值,则可以使用
find_if(…,IsEmpty)
std::string s1 = {"abc", "def" };
int i = NoOfStrings(s1);  // i = 2
std::vector<std::string> strings(10);
strings[0] = "one";
strings[1] = "two";

std::cout << "Length = " << strings.size() << std::endl;