你好我试图在任何一个负值(不包括负值)的情况下拆分一个数组,而且我现在有点卡住了。我尝试了一种方法,如我的代码所示,但我没有得到所需的输出。
#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;
}
答案 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)
您的代码中存在一些问题
以下是遇到负值时实际拆分的一些代码:
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)