将数组拆分为给定值

时间:2016-02-04 05:54:17

标签: c++ arrays split

你好我试图在任何一个负值(不包括负值)的情况下拆分一个数组,而且我现在有点卡住了。我尝试了一种方法,如我的代码所示,但我没有得到所需的输出。

    #include <iostream>
#include <string>
#include <vector>
#include <fstream>

using namespace std;

int main()
{
    string line;
    string filename;
    int n,length;
    std::vector<int>arr1;
    fstream file("t1.txt");
    if(file.is_open())
    {
        while(file >> n)
            arr1.push_back(n);
        for(int i =0; i < (int)arr1.size(); i++)
            cout << arr1.at(i);
    }
    cout << endl;
    int* arr2 = &arr1[0];
    int arr3[arr1.size()/2];
    int arr4[arr1.size()/2];
    for(int i = 0; i < arr1.size(); i++)
    {
        cout << arr2[i];
    }
    for (int i =0; i < arr1.size(); i++)
    {
        if(i == -1)
            break;
        else
            arr3[i] = arr2[i];
    }

    return 0;
}

2 个答案:

答案 0 :(得分:0)

主要问题在于:

int arr3[arr1.size()/2];
int arr4[arr1.size()/2];

这不能编译,可以用

替换
std::vector<int> arr3; arr3.reserve(arr1.size() / 2);
std::vector<int> arr4; arr4.reserve(arr1.size() / 2);

我添加了“reserve”功能,这样程序就不必在循环中反复分配内存。

接下来,您正在检查循环中的i,并且i循环从0到arr1.size()(这是无符号的,因此不能为负数)因此i永远不会消极。

您真正想要检查的是arr1 vector位于“i”位置的内容,您可以使用[]运营商执行此操作,例如

for (int i =0; i < arr1.size(); i++)
{
    if (arr1[i] >= 0) //if the value is positive, we push it inside our arr3 vector
        arr3.push_back(arr1[i]);
    else
    {
        i++; //skip negative value

        //
        while (i < arr1.size())
        {
            if (arr1[i] > 0)
                arr4.push_back(arr1[i]);

            i++;
        }
        //

        //or

        //insert all the elemenents we haven't processed yet in the arr4 vector
        //this code assumes those elements are positive values
        //arr4.insert(arr4.begin(), arr1.begin() + i, arr1.end());
        //break;


    }
}

当然,这可以通过不同的方式完成,比如创建2个向量,您可以只使用已经生成的向量。

希望这有帮助。

答案 1 :(得分:0)

您的代码中存在一些问题

  • 你不应该以这种方式访问​​矢量的数据,除非真的需要
  • 您准备具有预定义大小的数组,而不知道预期负值的位置
  • 您没有为阵列分配任何内容4
  • 检查索引是否为负值,而不是值
  • 根据您的文字,可能会有几个负值导致多个结果数组。你似乎只准备了两个。

以下是遇到负值时实际拆分的一些代码:

std::vector<vector<int> > splitted;
for (int i = 0; i < arr1.size(); ++i)
{
  if (i ==0 or arr1[i] < 0)
    splitted.push_back(std::vector<int>());

  if (arr1[i] >= 0)
    splitted.back().push_back(arr1[i]);
}

测试它:

for (int i = 0; i < splitted.size(); ++i)
{
  for (int k = 0; k < splitted[i].size(); ++k)
  {
    std::cout << splitted[i][k];
  }
  if (splitted[i].empty())
    std::cout << "(emtpy)";
  std::cout << '\n';
}

使用以下测试输入

1 2 3 -1 1 -1 -1

您将获得以下输出:

123
1
(emtpy)
(emtpy)