开发者

how to find number of elements in an array of strings in c++?

开发者 https://www.devze.com 2023-02-28 06:44 出处:网络
i have an array of string. std::string str[10] = {\"one\",\"two\"} How to find how many strings are present inside the str[] 开发者_JAVA百科array?? Is there any standard function?There are ten strin

i have an array of string.

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

How to find how many strings are present inside the str[] 开发者_JAVA百科array?? Is there any standard function?


There are ten strings in there despite the fact that you have only initialised two of them:

#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;
}

The output is:

10
one
two

===

If you want to count the non-empty strings:

#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;
}

This outputs 2 as expected.


If you want to count all elements sizeof technique will work as others pointed out. If you want to count all non-empty strings, this is one possible way by using the standard count_if function.

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;
 }


I don't know that I would use an array of std::strings. If you're already using the STL, why not consider a vector or list? At least that way you could just figure it out with std::vector::size() instead of working ugly sizeof magic. Also, that sizeof magic won't work if the array is stored on the heap rather than the stack.

Just do this:

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

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


You can always use countof macro to get the number of elements, but again, the memory was allocated for 10 elements and thats the count that you'll get.


The ideal way to do this is

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

int num_of_elements = sizeof( str ) / sizeof( str[ 0 ] );


Since you know the size. You could do a binary search for not null/empty.

str[9] is empty
str[5] is empty
str[3] is not empty
str[4] is empty
You have 4 items.

I don't really feel like implementing the code, but this would be quite quick.


Simply use this function for 1D string array:

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;
}

Usage:

std::string s1 = {"abc", "def" };
int i = NoOfStrings(s1);  // i = 2

I am just wondering if we can write a template meta program for this ! (since everything is known at compile time)


A simple way to do this is to use the empty() member function of std::string like this e.g.:

    size_t stringArrSize(std::string *stringArray) {

       size_t num = 0;
       while (stringArray->empty() != true) {
           ++num;
           stringArray++;
       }
       return num;

    }
0

精彩评论

暂无评论...
验证码 换一张
取 消