具有给定sentinel值的反向数组

时间:2016-02-11 06:56:07

标签: c++

仅供参考:我是编程新手。

我有10 0,哨兵价值为[1 2 3]

我的原始数组是[0 0 0 0 0 0 0 3 2 1](用户输入),但反过来是[3 2 1

我需要帮助来制作我的反向数组 int temp; for (int i = 0; i < arraysize/2; i++) { temp = array[arraysize-1-i]; array[arraysize - i - 1] = array[i]; array[i] = temp; } cout << "The reverse array: "; for (int i = 0; i < arraysize; i++) cout << array[i]<< ' '; cout << endl; ]。

这是我的代码:

{{1}}

3 个答案:

答案 0 :(得分:4)

只需使用标准库算法

auto end = std::find(std::begin(array),std::end(array),0);
std::reverse(std::begin(array),end);
//And if you only want to print the non-zero values:
size_t effectiveArraySize = end - std::begin(array);

如果固定大小的数组不是您的要求的一部分,您应该将您的用户数据放在一个自动增长的向量中,而不是使用可能变得太小的数组:

std::vector<int> v;
while(true) {
    int t;
    cin >> t;
    if (t == 0) {
       break;
    }
    v.push_back(t);       
}
std::reverse(v.begin(),v.end());

这样,你的数组/向量中就没有任何标记值。

答案 1 :(得分:1)

注意:使用STL(std::reversestd::find)中的相应功能更好,我只是猜测你必须自己实现它。

第一步:编写正确的反向功能。一个接收(指针)开头以及(指针)应该反转的范围结束。

第二步:编写一个函数来查找你的哨兵在阵列中的(第一个位置)(再次通过开头和结尾给出)

第三步:连接两个:从开头到你的哨兵的位置反转。

没有模板的示例:

void reverse(int * from, int * to) {
  while ((to - from) > 1) {
    --to;
    int temp = *from;
    *from = *to;
    *to = temp;
    ++from;
  }
}

int const * find(int const * from,
                 int const * const to,
                 int const value) {
  while ((from != to) && (*from != value)) {
    ++from;
  }
  return from;
}

void reverse_until (int * const from,
                                  int * const to,
                                  int const sentinel) {
  int const * const position_sentinel = find(from, to, sentinel);
  reverse(from, from + (position_sentinel - from));
  // return the sentinel position from this function
  // if you want only the reversed part
}

经过测试:

int main() {
  int test[10];
  for (size_t i = 0; i < 10; ++i) {
    test [i] = i + 1;
  }
  reverse_until (test, test + 10, 6);
  copy(test, test + 10, ostream_iterator<int>{cout, " "});
  return 0;
}

(live here)

答案 2 :(得分:-1)

在执行反向操作之前,您需要找到数组的实际长度,然后将该长度用于所有进一步的操作。

像这样:

int actualArraySize = 0;

while(actualArraySize < arraysize && array[actualArraySize]!=0)
{
 actualArraySize++;
}

int temp;
for (int i = 0; i < actualArraySize/2; i++)
{
  temp = array[actualArraySize-1-i];
  array[actualArraySize - i - 1] = array[i];
  array[i] = temp;
}

cout << "The reverse array: ";
for (int i = 0; i < actualArraySize; i++)
  cout << array[i]<< ' ';
cout << endl;

请注意,actualArraySize可能小于或等于arraysize,但不超过while(actualArraySize < arraysize && array[actualArraySize]!=0),因为0中的条件,这意味着当import numpy as np import cv2 params = np.zeros([1, 2]) # init params s_img = np.zeros((512, 512, 3), np.uint8) window_name = 'img' def main(): global s_img img = np.ones([512, 512, 3]) * 255 s_img = cv2.resize(img, (0, 0), fx=0.5, fy=0.5) cv2.startWindowThread() cv2.imshow(window_name, s_img) print ('Click corners to determine the field') cv2.setMouseCallback(window_name, on_mouse, None) while True: k = cv2.waitKey(0) & 0xFF if k == 27: break # destroy window def on_mouse(event, x, y, flag, param): global s_img if event == cv2.EVENT_LBUTTONDOWN: print ('here') cv2.circle(s_img, (x, y), 100, (255, 0, 0), -1) cv2.imshow(window_name, s_img) if __name__ == '__main__': main() 时停止找到{1}}或达到数组的大小。