在while循环中清除stringstream
Clearing stringstream in the midst of a while loop?
所以我一直在寻找如何将字符串向量转换为双向量的答案。每个人似乎都认为……
ss.str(std::string());
ss.str();
ss.str("");
应该工作。但我试过了,结果是不行。
我在使用stringstream之前已经这样做了,但是这次流中的缓存没有清除,我的输出只是一堆连续连接的数字。
例如,我输入7 9 58 33。我:
7 79 7958 795833
这是一个while循环,我认为这是复杂的事情,但我不认为这应该是一个问题。下面是代码。我所指的函数调用是real2double。问题出在函数的最后一个for循环中。
#include <iostream>
#include <String>
#include <vector>
#include <sstream>
using namespace std;
#ifndef Comp_Num
class Comp_Num
{
private:
std::vector <double> real;
std::vector <double> imag;
double real_in, imag_in;
string operation;
public:
Comp_Num();
Comp_Num(std::vector <string> complex_nums);
static std::vector <string> get_input();
static std::vector <string> get_real(std::vector <string> complexnum1);
static std::vector <string> get_imag(std::vector <string> complexnum2);
static void display(std::vector <string> display1);
static void display2(std::vector <double> display3);
static std::vector <string> set_compnum(std::vector <string> set_num);
static std::vector <string> comp2real(std::vector <string> c2r);
static vector <double> real2double (std::vector<string> r2d);
~Comp_Num();
/*
double Comp_Num::operator+ (double add_num);
double Comp_Num::operator- (double sub_num);
double Comp_Num::operator* (double mul_num);
double Comp_Num::operator/ (double div_num);
*/
};
#endif !Comp_Num
Comp_Num::Comp_Num(std::vector <string> complex_nums)
{
/*
std::vector <string> input_fin;
input_fin = Comp_Num::get_input();
Comp_Num::display(real1);
std::cout<<"What operation would you like to performn";
std::cout<<"You can choose from addition, subtraction, multiplication, or division.n";
std::cin>>operation>>"n";
*/
};
std::vector <string> Comp_Num::set_compnum(std::vector <string> set_num)
{
std::vector<string>comp1=Comp_Num::get_real(set_num);
std::vector <string>comp2= Comp_Num::get_imag(set_num);
std::vector <string>cmp2rl_fin = Comp_Num::comp2real(comp2);
std::vector <double>finale = Comp_Num::real2double(cmp2rl_fin);
Comp_Num::display(comp1);
Comp_Num::display(comp2);
Comp_Num::display(cmp2rl_fin);
Comp_Num::display2(finale);
system("pause");
return(comp2);
};
std::vector <string> get_input()
{
std::string usr_input, input1;
std::vector <string> complex;
std::cout<<"Enter the real or imaginary numbers you would like to perform your operation on.n";
std::cout<<"Enter abc for your last value.n";
std::getline(std::cin, usr_input);
std::istringstream input(usr_input);
while(input >> input1)
{
if(input1 == "abc")
break;
complex.push_back(input1);
}
std::cout<<'n';
return (complex);
};
std::vector <string> Comp_Num::get_imag(std::vector <string> complexnum2)
{
std::vector <string> imag1;
for(unsigned int i = 0; i < complexnum2.size(); ++i)
{
std::string str2 = "";
std::vector<char> char1(complexnum2[i].begin(), complexnum2[i].end());
for(unsigned int r = 0; r < char1.size(); ++r)
{
if(char1[r] >= '0' && char1[r] <= '9' || char1[r] == '-' || char1[r] == '.' || char1[r] == 'i')
{
str2 += char1[r];
if(char1[r] == 'i')
{
imag1.push_back(str2);
continue;
}
}
}
}
return(imag1);
};
std::vector <string> Comp_Num::get_real(std::vector <string> complexnum1)
{
std::vector <string> real1;
for(unsigned int i = 0; i < complexnum1.size(); ++i)
{
std::string str2 = "";
std::vector<char> char1(complexnum1[i].begin(), complexnum1[i].end());
for(unsigned int r = 0; r < char1.size(); ++r)
{
if(char1[r] >= '0' && char1[r] <= '9' || char1[r] == '-' || char1[r] == '.' || char1[r] == 'i')
{
str2 += char1[r];
if(char1[r] == 'i')
{
str2="";
break;
}
}
}
real1.push_back(str2);
}
return(real1);
};
void Comp_Num::display (std::vector <string> display1)
{
unsigned int i = 0;
while (i < display1.size())
{
std::cout<<display1[i]<<" ";
i++;
}
std::cout<<std::endl;
};
void Comp_Num::display2 (std::vector <double> display3)
{
unsigned int i = 0;
while (i < display3.size())
{
std::cout<<display3[i]<<" ";
i++;
}
std::cout<<std::endl;
};
std::vector <string> Comp_Num::comp2real(std::vector <string> c2r)
{
std::vector <string> real2;
for(unsigned int i = 0; i < c2r.size(); ++i)
{
std::string str2 = "";
std::vector<char> char1(c2r[i].begin(), c2r[i].end());
for(unsigned int r = 0; r < char1.size(); ++r)
{
if(char1[r] >= '0' && char1[r] <= '9' || char1[r] == '-' || char1[r] == '.')
{
str2 += char1[r];
}
}
real2.push_back(str2);
}
return(real2);
}
std::vector<double> Comp_Num::real2double (std::vector<string> r2d)
{
double y;
std::vector<double> final_r2d;
std::string str, str2;
std::vector<string>str3;
for(unsigned int i = 0; i < r2d.size(); ++i)
{
std::vector<char> ch(r2d[i].begin(), r2d[i].end());
for(unsigned int r = 0; r < ch.size(); ++r)
{
if(ch[r] >= '0' && ch[r] <= '9' || ch[r] == '-' || ch[r] == '.')
{
str2 += ch[r];
}
}
str3.push_back(str2);
}
for(unsigned int r = 0; r < str3.size(); r++)
{
// std::string open = "";
// istringstream to_double(open);
str = str3[r];
std::istringstream to_double(str);
while(to_double >> y)
{
final_r2d.push_back(y);
to_double.str(std::string());
}
}
return(final_r2d);
};
问题是在real2double的第一个循环中,您不断添加变量
str2 += ch[r];
必须将声明移动到循环中:
for(unsigned int i = 0; i < r2d.size(); ++i)
{
std::string str2;
后来取消代码重复:
template <class T>
static void display(std::vector <T> display);
template <class T>
void Comp_Num::display (std::vector <T> dis) {
for( typename std::vector<T>::iterator it = dis.begin() ; it != dis.end(); ++it ){
std::cout << *it << " ";
}
std::cout<<std::endl;
}
尽可能避免循环:
std::vector<double> Comp_Num::real2double (std::vector<string> r2d) {
for( std::vector<string>::iterator it = r2d.begin() ; it != r2d.end(); ++it ){
int iPos = (*it).find_first_not_of( "0123456789-." );
double y;
std::istringstream( (*it).substr( 0, iPos ) ) >> y;
final_r2d.push_back( y );
}
return final_r2d;
}
相关文章:
- 清除前检查矢量
- ifstream文件在从行中读取时被清除
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- C ++中的StringStream有助于使用向量从字符串中提取逗号分隔的整数,而不是空格分隔的整数,为什么?
- WINAPI 注册应用程序重新启动时不清除打开的套接字
- 如何清除/清空已打开的文件C++
- 使用 "stringstream " 将字符串转换为整数
- std::stringstream 返回字符 *
- 如何在 c++ 中清除矢量容量?
- 可以清除递归函数中的变量吗?
- 在清除 istream 之前,我不应该需要取消获取它吗?
- 结构成员在访问时被清除
- 清除输入缓冲区后未提取字符串流
- SDL_ttf清除我之前和将来的所有渲染
- std::stringstream::flush() 应该做什么吗?
- 如何使用内存集清除字符数组
- 为什么我必须在这里清除std::stringstream
- 为多个转换清除和重用stringstream
- 使用一行代码m.s swap(std::stringstream());清除stringstream
- 在while循环中清除stringstream