我得到:C:\Documents and Settings\ppp\Pulpit\Zadanie3Infix\main.cpp|72|error: conversion from 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >*' to non-scalar type 'std::vector<std::basic_string<char, std::char_traits<char>, std::allocator<char> >, std::allocator<std::basic_string<char, std::char_traits<char>, std::allocator<char> > > >' requested|
我不知道为什么。该函数假设返回字符串的向量,它确实使用了所有这些*&amp;它不起作用。请纠正我,这样它将返回此向量。
它的作用类似于s =“(2 + 23)”它将返回它将返回带有标记的向量。
vector<string> split(string s){
vector<string>* v = new vector<string>();
int i = 0; bool b;string el = "";
while(i < s.size()){
if(isNotNumber(s.at(i))){
el = s.at(i);
v->push_back(el);
cout<<el<<" to operator"<<endl;
el = "";
i++;
}else{
while( i <s.size() && !isNotNumber(s.at(i))){//LENIWE WYLICZANIE !!!
el = el + s.at(i);
cout<<s.at(i)<<" to liczba"<<endl;
i++;
}
v->push_back(el);
el = "";
}
}
cout<<"PO while"<<endl;
for(int i = 0; i < v->size();i++){
cout<<v->at(i)<<endl;
}
return v;
}
那是什么
stack<string>* stack = new stack<string>();
堆栈前的类型说明符; ////////////////
答案 0 :(得分:4)
您的函数split()
声称返回vector<string>
,但您的返回值为v
。什么是v
?这是
vector<string>* v
您正在尝试返回指针,但您的函数声明表明它没有返回指针。实际上,你的函数根本不需要指针;只需使用常规vector<string>
或通过引用传递向量:
void split(string s, vector<string>& v){
答案 1 :(得分:2)
您的函数签名返回一个向量,但您的返回值是一个指针。将返回值类型更改为指向vector的指针,或者在函数体中按值返回向量。
答案 2 :(得分:2)
关于是否返回指针或值,或者传递对现有向量的引用的问题很久以前就解决了:不要做以上任何一项。相反,创建一个与迭代器一起使用的通用算法:
template <class InIt, class OutIt>
void tokenize(InIt b, InIt e, OutIt o) {
while (b != e) {
std::string token;
while (isdigit(*b))
token.push_back(*b++);
if (!token.empty())
*o++ = token;
while (!isdigit(*b) && b != e)
*o++ = std::string(1, *b++);
}
}
要将结果放在字符串向量中,您可以执行以下操作:
std::string i("(2+23)");
std::vector<std::string> tokens;
tokenize(i.begin(), i.end(), std::back_inserter(tokens));
或者,如果您想显示令牌,每行一个用于测试:
tokenize(i.begin(), i.end(), std::ostream_iterator<std::string>(std::cout, "\n"));
......将产生:
(
2
+
23
)
这符合我认为的输入字符串中的标记。但是,我应该补充一点,虽然它适用于那个输入,它可能会或可能不会产生你对其他输入的期望。特别是,它会将空白字符视为令牌,而这些令牌通常不想要(但似乎原本是如何工作的)。
答案 3 :(得分:1)
这真是Blastfurnace的回答,......
但转换行:
vector<string>* v = new vector<string>();
进入
vector<string> v;
并将所有v->
更改为v.
这样你也可以修复内存泄漏。 (永远不会删除new vector<string>()
分配的内存)。但是,vector<string> v;
将内存放在堆栈上,并在超出范围时自动删除。