如何在C ++中定义开始和结束值?

时间:2015-11-24 20:44:28

标签: c++ arrays count

我有一个这样的数组:

600

250

600

600

600

我想定义此数组的开始和结束索引,其中值大于500。 我创建了一个值为2的变量,因为我的数组中有两个部分,其值大于500(1-1和3-5)。

那么我怎么能输出这个:

1 1 3 5

第一个表示开始索引为1,第二个表示结束索引也为1。 3表示下一节开始索引,其中值大于500是3。 5表示第二部分的结束索引为5。

4 个答案:

答案 0 :(得分:1)

使用std:

std::vector<std::pair<std::size_t, std::size_t>>
compute_range_greater_than(const std::vector<int>& v, int threshold)
{
    std::vector<std::pair<std::size_t, std::size_t>> res;

    for (auto it = v.begin(); it != v.end(); /*Empty*/)
    {
        auto beg = std::find_if(it, v.end(), [=](int i) { return !(i < threshold); });
        if (beg == v.end()) {
            return res;
        }
        it = std::find_if(beg, v.end(), [=](int i) { return i < threshold; });
        // using 1-index
        res.push_back({1 + std::distance(v.begin(), beg), std::distance(v.begin(), it)});
    }
    return res;
}

Live Demo

答案 1 :(得分:0)

试试这个:

    #include <iostream>
    #include <vector>

    int main()
    {
        std::vector<int> v;
        v.push_back(10);
        v.push_back(200);
        v.push_back(170);
        v.push_back(160);
        v.push_back(20);
        v.push_back(300);
        v.push_back(12);
        v.push_back(230);

        std::vector<int> indexes;
        int limit = 150;

        bool started = false;
        for (int i = 0; i < v.size(); i++)
        {
            int value = v[i];

            if (value > limit && !started)
            {
                started = true;
                indexes.push_back(i);
            }
            else if (value < limit && started)
            {
                started = false;
                indexes.push_back(i - 1);
            }
        }

        if (started)
            indexes.push_back(v.size() - 1);

        for (int i = 0; i < indexes.size(); i++)
        {
            if (i % 2 == 0)
                std::cout << indexes[i] << "-";
            else
                std::cout << indexes[i] << "; ";
        }

        return 0;
    }

此限制为150,但您可以更改它。输出

1-3; 5-5; 7-7;

祝你好运:)

答案 2 :(得分:0)

你真的应该考虑改进你的问题,更好地解释你想做什么,并提供你已经写过的代码(如果你没有,你应该这样做)。但是,我心情很好,所以你走了:

#include <vector>
#include <iostream>

struct BeginAndEndIndex{
    int begin;
    int end;
    BeginAndEndIndex(int begin) : begin(begin),end(begin) {}
};
typdef std::vector<BeginAndEndIndex> IndexV;
typdef std::vector<int> IV;
IndexV findBeginAndEndIndex(const IV& in,int threshold){
    IndexV result;
    bool isBiggerThanThreshold = false;
    for (int i=0;i<in.size();i++){
        if (!isBiggerThanThreshold) {
            if (in[i]>threshold){ 
                result.push_back(BeginAndEndIndex(i)); 
                isBiggerThanThreshold = true;
            }
        } else {
            if (in[i]<threshold){ 
                result.back().end = i-1;
                isBiggerThanThreshold = false;
            }
        }
    }
    if (isBiggerThanThreshold){result.back().end = in.size()-1;}
    return result;
}

int main(void) {
    IV foo {600,250,600,600,600};
    IndexV bar = findBeginAndEndIndex(foo,500);

    for (int i=0;i<bar.size();i++){
        std::cout << bar[i].begin << "  " << bar[i].end << std::endl;
    } 
    return 0;
}

我很确定使用std :: algorithms实现它有一种更优雅的方式。

答案 3 :(得分:0)

在直接C中并且不将索引存储在任何地方,以下代码会生成您要求的确切输出:

#include <stdio.h>

int main(int argc, char **argv)
{
  int values[] = {600, 250, 600, 600, 600};
  int threshhold = 500;
  int begIndex = -1;
  int endIndex = -1;
  int i;

  for (i = 0; i < sizeof(values)/sizeof(values[0]); i++)
  {
    if (values[i] > threshhold)
    {
      if (begIndex < 0)
      {
        begIndex = i;
      }
      endIndex = i;
    }
    else if (begIndex >= 0)
    {
      printf("%d %d ", begIndex + 1, endIndex + 1);
      begIndex = endIndex = -1;
    }
  }
  if (begIndex >= 0)
    printf("%d %d", begIndex + 1, endIndex + 1);
  printf("\n");
  return 0;
}

请记住,C / C ++中的数组从零开始,而不是一个。更改上面的代码以存储begIndex和endIndex对应该是一个简单的操作。