[英]returning vector<string> in c++
我得到: 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|
而且我不知道为什么。 该函数假定返回字符串向量,但确实如此,我使用了所有这些*&,但它不起作用。 请更正我,以便它将返回此向量。
它的工作方式类似于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>();
在堆栈之前输入类型说明符; /////////////////
您的函数split()
声称返回vector<string>
,但是返回值为v
。 什么是v
? 它的
vector<string>* v
您试图返回一个指针,但是函数声明指出它没有返回指针。 实际上,您的函数根本不需要指针。 只需使用常规vector<string>
或通过引用传入向量:
void split(string s, vector<string>& v){
您的函数签名返回一个向量,但是您的返回值是一个指针。 将返回值类型更改为指向vector的指针,或在函数体内按值返回vector。
关于返回指针还是值,还是传递对现有矢量的引用的问题早已解决:不要执行上述任何操作。 而是创建一个与迭代器一起使用的通用算法:
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
)
这符合我认为是此输入字符串中的标记的内容。 但是,我应该补充一点,尽管它适用于该输入,但是它可能会或可能不会产生您对其他输入的期望。 特别是,它将空白字符视为标记,您通常不希望使用这些标记(但似乎确实是原始字符的工作方式)。
这真的是高炉的答案,...
但转换行:
vector<string>* v = new vector<string>();
进入
vector<string> v;
并将所有v->
更改为v.
这样,您也可以修复内存泄漏。 (永远不会删除由new vector<string>()
分配的内存)。 但是, vector<string> v;
将内存放在堆栈上,并在超出范围时自动删除。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.