By evergreen


2014-02-25 08:41:30 8 Comments

Code for dynamic array by entering size and storing it into "n" variable, but I want to get the array length from a template method and not using "n".

int* a = NULL;   // Pointer to int, initialize to nothing.
int n;           // Size needed for array
cin >> n;        // Read in the size
a = new int[n];  // Allocate n ints and save ptr in a.
for (int i=0; i<n; i++) {
    a[i] = 0;    // Initialize all elements to zero.
}
. . .  // Use a as a normal array
delete [] a;  // When done, free memory pointed to by a.
a = NULL;     // Clear a to prevent using invalid memory reference.

This code is similar, but using a dynamic array:

#include <cstddef>
#include <iostream>
template< typename T, std::size_t N > inline
std::size_t size( T(&)[N] ) { return N ; }
int main()
{
     int a[] = { 0, 1, 2, 3, 4, 5, 6 };
     const void* b[] = { a, a+1, a+2, a+3 };
     std::cout << size(a) << '\t' << size(b) << '\n' ;
}

1 comments

@Reinstate Monica 2014-02-25 08:46:09

You can't. The size of an array allocated with new[] is not stored in any way in which it can be accessed. Note that the return type of new [] is not an array - it is a pointer (pointing to the array's first element). So if you need to know a dynamic array's length, you have to store it separately.

Of course, the proper way of doing this is avoiding new[] and using a std::vector instead, which stores the length for you and is exception-safe to boot.

Here is what your code would look like using std::vector instead of new[]:

size_t n;        // Size needed for array - size_t is the proper type for that
cin >> n;        // Read in the size
std::vector<int> a(n, 0);  // Create vector of n elements initialised to 0
. . .  // Use a as a normal array
// Its size can be obtained by a.size()
// If you need access to the underlying array (for C APIs, for example), use a.data()

// Note: no need to deallocate anything manually here

@Lightness Races with Monica 2014-02-25 08:48:57

Not sure I understand why this has been downvoted. Actually, I'm sure I don't...

@Reinstate Monica 2014-02-25 08:51:38

@LightnessRacesinOrbit Same here. Perhaps somebody thought I should have looked for that duplicate instead of answering?

@juanchopanza 2014-02-25 08:54:43

I've observed a strong correlation between no good reason to downvote and no comment/suggestion to improve/fix the answer.

@Reinstate Monica 2014-02-25 08:56:49

@juanchopanza Not to sound repetitive, but same here :-)

@evergreen 2014-02-25 08:58:57

now how to define and use vector method for dynamic array and get size?

@Mike Seymour 2014-02-25 09:05:41

@evergreen: You don't need to define it. vector already has a size() member function; call that when you want to know the size.

@Reinstate Monica 2014-02-25 09:09:03

@evergreen I've expanded the answer with how your code would look with std::vector instead of new[]

@James Kanze 2014-02-25 09:32:12

And you might as well say it: the way you spell "dynamic array" in C++ is std::vector, not T* array = new T[]. One can't stress enough that there is never a reason to use array new (or at least almost never---but I've been using C++ for more than 20 years, and I've never found a case where array new was appropriate).

@Reinstate Monica 2014-02-25 09:42:43

@JamesKanze +1. Though I believe implementing std::vector might be a use case for new[].

@James Kanze 2014-02-25 09:59:50

@Angew Any reasonable vector class (and the standard requires it of std::vector) will separate allocation and initialization, probably be using the std::operator new() function and placement new. Otherwise, you end up having to default construct all of the elements, and then assign to them, rather than constructing them with the desired initializer immediately. (When I first started C++, there wasn't a std::vector, and of course, the first thing one did was write your own vector and string classes.)

@Reinstate Monica 2014-02-25 10:09:38

@JamesKanze Right, excellent point about the allocation-init separation. So it seems I've run out of ideas for use of new[] as well.

Related Questions

Sponsored Content

17 Answered Questions

[SOLVED] How can I profile C++ code running on Linux?

  • 2008-12-17 20:29:24
  • Gabriel Isenberg
  • 493719 View
  • 1739 Score
  • 17 Answer
  • Tags:   c++ unix profiling

23 Answered Questions

[SOLVED] What is the "-->" operator in C++?

28 Answered Questions

[SOLVED] How do you set, clear, and toggle a single bit?

26 Answered Questions

37 Answered Questions

13 Answered Questions

[SOLVED] What is the effect of extern "C" in C++?

76 Answered Questions

[SOLVED] How do I iterate over the words of a string?

  • 2008-10-25 08:58:21
  • Ashwin Nanjappa
  • 2143928 View
  • 2902 Score
  • 76 Answer
  • Tags:   c++ string split

1 Answered Questions

[SOLVED] The Definitive C++ Book Guide and List

  • 2008-12-23 05:23:56
  • grepsedawk
  • 2248862 View
  • 4246 Score
  • 1 Answer
  • Tags:   c++ c++-faq

10 Answered Questions

Sponsored Content