Regular loop to Pointer loop conversion, how? [closed] - c++

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 years ago.
Improve this question
SomeClass* stuff;
int N = 10;
stuff = new SomeClass[N];
Someclass* objectPtrDelete = null;
int i = 0;
for(Someclass* pointer = begin(); pointer != end(); pointer++)
{
if(pointer->getSomeAttr() == randomPointer.getSomeAttr()){
objectPtrDelete = pointer;
break;
}
i++;
}
// Shrinking the C-array with this for loop, shifting left
for (int j = i; j < N-1; j++)
stuff[j] = stuff[j + 1];
Can the last loop be converted into a Pointer loop, if yes, how is this properly done? Note, the names are fictional i.e. something imaginary. I have implemented something similar, but, I would like to understand how can I convert the last loop to a pointer for loop that does the same operation.
Make this:
for (int j = i; j < N-1; j++)
stuff[j] = stuff[j + 1];
Into a Pointer loop.

For starters this construction (without an ending semicolon)
int[] a = new int[N]
is invalid in C++.
It should look like
int *a = new int[N];
If I have understood your question correctly you mean something like the following
for ( auto prev = a, next = a + 1; next != a + N; ++next )
{
*prev++ = *next;
}

(edited to take into account your changes)
if I well understand what you want, having
SomeClass* stuff;
you can replace
for (int j = i; j < N-1; j++)
stuff[j] = stuff[j + 1];
by
for (SomeClass * p = stuff + i; p < stuff + N-1; p++)
*p = *(p + 1);
or to easily manages changes concerning the type :
for (auto p = stuff + i; p < stuff + N-1; p++)
*p = *(p + 1);
etc

Related

Sort an array by using function in C++ [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 2 months ago.
Improve this question
I want to make a sort statement by using a function. The problem is, I cannot return it back to the main() function. What's the problem? I also tried the void.
int sort_func(int sort[]) {
int swap = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; i++) {
if (sort[j] > sort[j + 1]) {
swap = sort[j];
sort[j] = sort[j + 1];
sort[j + 1] = swap;
}
}
}
return sort[5];
}
What is the problem in the code?
You don't need to return anything. The array is being passed into the function via an int* pointer, so the code is directly manipulating the elements of the caller's array.
Also, your 2nd for loop is incrementing i when it should be incrementing j instead.
How is the caller's array declared, exactly? The loops inside your function require the sort parameter to point at an int[] array with at least 5 elements. However, the function's declaration does not convey or enforce that requirement, so the caller is free to pass in however many elements it wants, and if that size is fewer than 5 then your code will have undefined behavior. You should at least have the caller pass in the actual number of elements as another parameter, eg:
void sort_func(int sort[], int size) {
int swap = 0;
for (int i = 0; i < size; i++) {
for (int j = 0; j < (size-1); j++) {
if (sort[j] > sort[j + 1]) {
swap = sort[j];
sort[j] = sort[j + 1];
sort[j + 1] = swap;
}
}
}
}
int arr[5];
...
sort_func(arr, 5);
Otherwise, if you strictly require 5 elements, then enforce that by taking a pointer to an array with exactly 5 elements, eg:
void sort_func(int (*sort)[5]) {
int swap = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
if ((*sort)[j] > (*sort)[j + 1]) {
swap = (*sort)[j];
(*sort)[j] = (*sort)[j + 1];
(*sort)[j + 1] = swap;
}
}
}
}
int arr[5];
...
sort_func(&arr);
Or, use a reference instead of a pointer, eg:
void sort_func(int (&sort)[5]) {
int swap = 0;
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 4; j++) {
if (sort[j] > sort[j + 1]) {
swap = sort[j];
sort[j] = sort[j + 1];
sort[j + 1] = swap;
}
}
}
}
int arr[5];
...
sort_func(arr);

How to Increment values of an an array using a nested-loop [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 2 years ago.
Improve this question
So I need help. The problem is that an int arr[5] = {0};
I know the array has the values {0,0,0,0,0} filling the whole array. At the end of the code the array must have the values {1,2,3,4,5} inside it. To solve it must use a nested for loop.
I have tried the following code
Sorry if there is an error in the way this question is formatted this is my first time and using mobile.
int arr[5] = {0};
for(int j = 1; j<6; j++)
{
for(int i = 0; i<5; i++)
{
arr[i] = j;
}
}
I don't know what the benefit of that but If you have to use nested for loop, the following is an option
int main()
{
int arr[5] = {0};
for(int j = 0; j < 5; ++j)
{
for(int i = 1; i < 2; ++i)
{
arr[j] = j+i;
}
}
for(int i{};i<5;++i) std::cout << arr[i] << ", ";
}
Or like #JaMit comment suggests
int main()
{
int arr[5] = {0};
for(int j = 0; j < 5; ++j)
{
for(int i = 0; i < j+1; ++i)
{
arr[j]++;
}
}
for(int i{};i<5;++i) std::cout << arr[i] << ", ";
}
I'm guessing your professor means you should generate the final results using only incrementation. In other words, I'm guessing you're not allowed to assign values after the int arr[5] = {0}; line (so an expression like arr[i] = j; is not allowed).
In that case, you could solve the problem as follows:
int arr[5] = {0};
for (int i = 0; i < 5; i++) {
for (int j = i; j < 5; j++) {
arr[j]++;
}
}
Now we have only used incrementation and the final result is {1, 2, 3, 4, 5}.

How do I create a four-dimensional array of pointers? [closed]

Closed. This question needs debugging details. It is not currently accepting answers.
Edit the question to include desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem. This will help others answer the question.
Closed 3 years ago.
Improve this question
I am trying to create a four-dimensional array of pointers. The type of the array is a Gurobi type "GRBVar". However, I am unsure of the syntax to use.
GRBVar**** testArray = new GRBVar*** [numBuses];
for (int i = 0; i < numBuses; i++) {
testArray[i] = new GRBVar** [maxRoute];
for (int j = 0; j < maxRoute; j++) {
testArray[j] = new GRBVar* [numJobs];
for (int k = 0; k < numJobs; k++) {
testArray[k] = new GRBVar[numJobs];
}
}
}
The above causes an error. How can I fix it?
Literally you can create it like GRBVar* array[10][10][10][10], but it's better to use nested std::vector for this purpose, like std::vector<GRBVar*>, std::vector<std::vector<GRBVar*>> etc, and moreover - use aliases, like
using Jobs = std::vector<GRBVar*>;
using Routes = std::vector<Jobs>;
using Buses = std::vector<Routes>;
And then initialize it:
Buses buses;
for (int i = 0; i < numBuses; i++) {
Routes routes;
for (int j = 0; j < maxRoute; j++) {
Jobs jobs;
for (int k = 0; k < numJobs; k++) {
jobs.push_nack(new GRBVar);
}
routes.push_back(jobs);
}
buses.push_back(routes);
}
You need to increase the [] levels in your nested for loops to assign the pointers to their proper objects.
#include <iostream>
typedef struct SomeObject { int r; } *GRBVar; // this keeps the syntax as close as possible to the original question
int main()
{
int numBuses = 2;
int maxRoute = 3;
int numJobs = 4;
SomeObject* someobjects = new SomeObject[numBuses * maxRoute * numJobs * numJobs];
// This creates and initializes a 4D array of pointers to SomeObjects
GRBVar**** testArray = new GRBVar ***[numBuses];
for (int i = 0; i < numBuses; i++) {
testArray[i] = new GRBVar **[maxRoute];
for (int j = 0; j < maxRoute; j++) {
testArray[i][j] = new GRBVar *[numJobs];
for (int k = 0; k < numJobs; k++) {
testArray[i][j][k] = new GRBVar[numJobs];
for (int m = 0; m < numJobs; m++)
testArray[i][j][k][m] = someobjects++;
}
}
}
testArray[0][0][0][0]->r = 1;
testArray[0][0][0][1]->r = 2;
testArray[0][0][1][0]->r = 3;
std::cout << testArray[0][0][0][0]->r << " " << testArray[0][0][0][1]->r << " " << testArray[0][0][1][0]->r << "\n";
}

Nested loop with arrays having repeating numbers [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
I have an array that keeps the number of each element.
int total[5] = {2,3,4,5,6}
int num = 5; //array total has 5 elements
This means that we have 2 element 0's, 3 element 1's in our original array. We are not worried about the original array since I already have a code to keep the number of the elements.
I need a nested for loop that creates a new array that looks like this:
array[0] = 1;
array[1] = 1;
array[2] = 5;
array[3] = 5;
array[4] = 5;
array[5] = 9;
array[6] = 9;
array[7] = 9;
array[8] = 9;
and so on. That is, we store a value in our new array as many as the its value in "total" array. Values 1,5,9, etc. are stored in an array called element. I have something like this so far:
for (int i = 0; i < num; i++){
for (int j = 0; j < total[i]; j++){
array[i + j] = element[i];
}
}
Can somebody help me to figure this out?
An easy solution (though not necessarily elegant) is to do the following:
int count = 0;
for (int i = 0; i < num; i++){
for (int j = 0; j < total[i]; j++){
array[count] = element[i];
count++;
}
}
then you don't need to worry about trying to figure out what position you are at for the array.
You need to track the number of the elements:
int sum = 0;
for (int i = 0; i < num; i++){
for (int j = 0; j < total[i]; j++){
array[sum + j] = element[i];
}
sum += total[i];
}

Implementation of CountSort [closed]

Closed. This question needs details or clarity. It is not currently accepting answers.
Want to improve this question? Add details and clarify the problem by editing this post.
Closed 8 years ago.
Improve this question
So to cut a long story short, I am trying to implement countsort for vector. I have some error somewhere in my code, though I think that I have followed the pseudo code pretty strictly.
The function:
void csort(vector<int>& a, vector<int>& b)
{
vector<int> c(a.size());
for(int i = 0; i <= c.size(); i++)
c[i] = 0;
for(int i = 0; i <= a.size(); i++ )
{
c[a[i]]++;
}
for(int i = 0; i <= c.size(); i++)
{
c[i]+= c[i-1];
}
for(int i = a.size(); i < 1; i--)
{
b[c[a[i]]] = a[i];
c[a[i]] =c[a[i]] -1;
}
}
The pesudo code:
let C[k] be a new array
for i = 0 to k
C[i] = 0
for j = 1 to A:length
C[A[j]] = C[A[j]] +1
for i = 1 to k
C[i] = C[i]+ C[i-1]
for j = A:length downto 1
B[C[A[j]]] = A[j]
C[A[j]] = C[A[j]] -1
The code as it is is very unreadable and error prone. In any case, what I first saw is that in the snippet below you will access c[-1] at the first iteration, thus incurring in undefined behaviour.
for (int i = 0; i <= c.size(); i++)
{
c[i] += c[i-1]; // Evaluation of c[i-1] is illegal for i == 0
}
for(int i = a.size(); i < 1; i--)
This code won't work at all.
for j = A:length downto 1
↑
To implement this pseudo code, you should do like this
for(int i(a.size()-1);i>=0;--i)
And for code like this( c[a[i]] ),you will get run-time error if a[i]<0 or a[i]>=c.size()