Could you help me organize a dynamic array of points?
I have coped with a dynamic array of integers. But I don't know how to organize it with structures.
Here is my code so far...
#include "stdafx.h"
#include <cstdlib>;
#include <iostream>;
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
int i = 0; // Array index.
struct Point
{
int x;
int y;
};
size_t n = sizeof(int);
int * points = static_cast<int*>(malloc(n));
char command;
do
{
cout << "n - Create new point." << endl;
cout << "q - Quit." << endl;
cout << "Input a new command: ";
cin >> command;
if (command == 'n')
{
points[i] = 1;
i++;
/* points[i] = new Point();
points[i].x = 1;
points[i].y = 1; */
// cout<<"("<<point1.x<<","<<point1.y<<")";
}
else if (command == 'q')
{
for (int j = 0; j < i; j++)
cout << points[j] <<endl;
system("pause");
return 0;
}
else
{
cout << "Please, enter a correct command." << endl << endl << endl;
}
} while (true);
system("pause");
return 0;
}
std::vector
is a sequence container that encapsulates dynamic size arrays.
This is what you should use in C++ , rather than a dynamically-allocated array of struct
s as you would in C .
Here is how you can start to incorporate this into your code (untested)...
#include <vector>
#include <iostream>
struct Point
{
int x;
int y;
};
typedef std::vector<Point> PointVector;
int main()
{
using std::cout;
using std::cin;
using std::endl;
PointVector points;
char command = 0;
do
{
cout << "n - Create new point." << endl;
cout << "q - Quit." << endl;
cout << "Input a new command: ";
cin >> command;
if (command == 'n')
{
Point new_point;
new_point.x = 1;
new_point.y = 1;
points.push_back(new_point);
cout << "(" << new_point.x << "," << new_point.y << ")\n";
}
else if (command == 'q')
{
for (PointVector::iterator it = points.begin(), end = points.end();
it != end;
++it)
{
cout << "(" << it->x << "," << it->y << ")\n";
}
break;
}
else
{
cout << "Please, enter a correct command." << endl;
}
} while(true);
}
typedef
s often make code more readable std::vector::push_back()
adds to the end of the container, without you needing to keep an index or be overly-concerned about size. std::vector::begin()
) make it easy to access the elements within the container, again without needing to keep an index. See also Why use iterators instead of array indices? points
as your malloc()
based implementation would do. By the look of it, you are using malloc
to grab enough memory to store a pointer to an int. Dont use malloc
/ free
. This is C++, use new
or delete
if you really have to.
Thankfully, this is an occasion where you don't have to worry about dynamically allocating memory as you can do all this in a vector
as follows:
// First create a vector of points.
std::vector<Points> points;
// Now create the Point (i'm assuming you were going to read
// it from the input stream here.)
cin >> x >> y;
Point p;
p.x = x;
p.y = y;
// And add it to the vector.
points.push_back( p );
It's that simple, you don't need to worry about increasing the capacity of the points vector or clearing it down at the end.
You can use vectors as @iedoc suggested:
#include <iostream>;
#include <vector>;
using namespace std;
struct SPoint
{
int X;
int Y;
};
int main()
{
vector<SPoint> points;
char command;
do
{
cout << "n - Create new point." << endl;
cout << "q - Quit." << endl;
cout << "Input a new command: ";
cin >> command;
if (command == 'n')
{
int x = 0;
int y = 0;
cout << "X: ";
cin >> x;
cout << "Y: ";
cin >> y;
SPoint point = { x, y};
points.push_back(point);
}
else if (command == 'q')
{
for (int i = 0; i < points.size(); ++i)
{
cout << "(" << points[i].X << "," << points[i].Y << ")";
}
return 0;
}
else
{
cout << "Please, enter a correct command."<<endl<<endl<<endl;
}
}
while(true);
return 0;
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.