簡體   English   中英

在C ++中交換數組值

[英]swap array values in c++

如果我的v = 4在a [n]中,我想向左移動數組值,從a [n]刪除4,並在結尾索引處添加0,我該怎么做?

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


一些有用的鏈接: 向量查找迭代器擦除push_back

您可以使用std::rotate 我建議您使用std::vector而不是C數組,並充分利用STL算法。 不過,下面我將說明兩個版本,一個版本帶有C數組,另一個版本帶有std::vector

C數組版本:

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

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

這是使用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";

為什么有人會使用這些笨拙的算法? 好吧,有幾個原因。 首先,它們與容器無關。 這將適用於數組,向量和雙端隊列,沒問題。 其次,它們可以輕松地一次用於處理所有元素,而不僅僅是單個項目,並且可以在容器之間進行復制等。 它們也與類型無關...您有一個字符串數組,一個整數向量或其他更復雜的內容,並且這些算法仍然可以正常工作。

一旦您克服了最初的用戶不友好之處,它們就非常強大。

當然,您始終可以使用std::arraystd::vector或其他任何方法而無需使用標准庫算法。

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;

作為最后一個示例,您可以使用memmove (由BLUEPIXY建議)在一個函數調用中執行改組操作:

#include <cstring>

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM