0

I want to shift left array values if my v=4 is in a[n],remove 4 from a[n] and at the end index add 0,how i can do this?

#include <iostream>

using namespace std;
const int n=5;
int main()
{

int a[n]={1,5,4,6,8}, v=4;
int b[n];

cout << "Enter a Value" << endl; 
cout<<v<<endl;

for(int i=0; i<n; i++){
 cout<<a[i];            
}
cout<<endl;
for(int j=0; j<n; j++){
    b[j]=a[j];
    if(a[j]==v)
    b[j]=a[++j];


  cout<<b[j];            
  }


 return 0;
 }
16
  • 2
    you are not taking input to v, if(a[j]=v) should be f(a[j]==v) Commented May 20, 2014 at 10:17
  • 2
    cout<<v<<endl; performs output, not input. Commented May 20, 2014 at 10:18
  • 1
    if(a[j]=v) shouldn't it be if(a[j]==v)? Commented May 20, 2014 at 10:19
  • 2
    You also go out of bounds with a[j+1] Commented May 20, 2014 at 10:19
  • 2
    @BLUEPIXY Uh, no. Not in C++. Commented May 20, 2014 at 10:21

3 Answers 3

3
#include <vector>       // needed for vector 
#include <algorithm>    // needed for find
#include <iostream>     // needed for cout, cin 

using namespace std;

// Vectors are just like dynamic arrays, you can resize vectors on the fly

vector<int> a { 1,5,4,6,8 };  // Prepare required vector
int v;

cout << "enter value";  // Read from user
cin >> v;

auto itr = find( a.begin(), a.end(), v);  // Search entire vector for 'v'
if( itr != a.end() ) // If value entered by user is found in vector
{
    a.erase(itr);    // Delete the element and shift everything after element
                     // Toward beginning of vector. This reduces vector size by 1
    a.push_back(0);  // Add 0 in the end. This increases vector size by 1
}

for( int i : a )     // Iterate through all element of a (i holds element)
    cout << i;       // Print i
cout << '\n';        // Line end


a few helpful links: vector , find , iterator , erase , push_back

Sign up to request clarification or add additional context in comments.

2 Comments

@user2841243 then refer to the documentation of std::vector and <algorithm> header.
@MohitJain eh, should be; right now boost::range is a way to get that syntax.
2

You could use std::rotate. I suggest that you use std::vector instead of C arrays and take full advantage of the STL algorithms. Nevertheless, below I'm illustrating two versions one with C arrays and one with std::vector:

Version with C array:

#include <iostream>
#include <algorithm> 

int main()
{
int const n = 5;
int a[n] = {1,5,4,6,8};
std::cout << "Enter a Value" << std::endl;
int v;
std::cin >> v;

for(auto i : a) std::cout << i<< " ";
std::cout << std::endl;

auto it = std::find(std::begin(a), std::end(a), v);
if(it != std::end(a)) {
  std::rotate(it + 1, it, std::end(a));
  a[n - 1] = 0;
}

for(auto i : a) std::cout << i<< " ";
std::cout << std::endl;

 return 0;
}

Version with vector:

#include <iostream>
#include <vector>
#include <algorithm> 

int main()
{
std::vector<int> a{1,5,4,6,8};
std::cout << "Enter a Value" << std::endl;
int v;
std::cin >> v;

for(auto i : a) std::cout << i<< " ";
std::cout << std::endl;

auto it = std::find(std::begin(a), std::end(a), v);
if(it != std::end(a)) {
  std::rotate(it + 1, it, std::end(a));
  a.back() = 0;
}

for(auto i : a) std::cout << i<< " ";
std::cout << std::endl;

 return 0;
}

Comments

1

Here's an example using std::array

#include <array>
#include <algorithm>

// defines our array.
std::array<int, 5> a = {{ 1, 2, 3, 4, 5 }};

// find the position of the element with the value 4.
auto where = std::find(a.begin(), a.end(), 4);

// if it wasn't found, give up
if (where == a.end())
  return 0;

// move every element past "where" down one.
std::move(where + 1, a.end(), where);

// fill the very last element of the array with zero
a[ a.size() - 1] = 0;

// loop over our array, printing it to stdout
for (int i : a)
  std::cout << i << " ";

std::cout << "\n";

Why would anyone use these awkward algorithms? Well, there are a few reasons. Firstly, they are container-independant. This will work with arrays and vectors and deques, no problem. Secondly, they can be easily used to work with a whole range of elements at once, not just single items, and can copy between containers and so on. They're also type-independant... you acn have an array of strings, or an vector of ints, or other more complex things, and the algorithms will still work just fine.

They're quite powerful, once you've got over their initial user-unfriendliness.

You can always use either std::array or std::vector or whatever without using the standard library algorithms, of course.

std::array<int, 5> a = {{ 1, 2, 3, 4, 5 }};

size_t where = 0;
int to_remove = 4;

// scan through until we find our value.
while (a[where] != to_remove && where < a.size())
  where++;

// if we didn't find it, give up
if (where == a.size())
  return 0;

// shuffle down the values
for (size_t i = where; i < a.size() - 1; i++)
  a[i] = a[i + 1];

// set the last element to zero
a[ a.size() - 1] = 0;

As a final example, you can use memmove (as suggested by BLUEPIXY) to do the shuffling-down operation in one function call:

#include <cstring>

if (where < a.size() - 1)
  memmove(&a[where], &a[where + 1], a.size() - where);

1 Comment

You should really not use memmove, use std::move (or std::rotate). Under the hood it’s the same but it has a safe C++ interface.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.