0

我得到: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>();

堆栈前的类型说明符;//////////////

4

4 回答 4

4

您的函数split()声称要返回vector<string>,但是您的返回值是v. 是什么v?它是

vector<string>* v

您正试图返回一个指针,但您的函数声明表明它没有返回一个指针。实际上,函数中根本不需要指针。只需使用常规vector<string>或通过引用传入向量:

void split(string s, vector<string>& v){
于 2012-08-25T15:48:47.863 回答
2

您的函数签名返回一个向量,但您的返回值是一个指针。将返回值类型更改为指向向量的指针或在函数体中按值返回向量。

于 2012-08-25T15:49:05.963 回答
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
)

这符合我认为的输入字符串中的标记。但是,我应该补充一点,虽然它适用于该输入,但它可能会或可能不会产生您对其他输入的期望。特别是,它将空白字符视为您通常想要的标记(但似乎确实是原件的工作方式)。

于 2012-08-25T16:47:21.163 回答
1

这真的是Blastfurnace的答案,......

但转换行:

vector<string>* v = new vector<string>();

进入

vector<string> v;

并将所有更改v->v.

这样你也可以修复内存泄漏。(分配的内存new vector<string>()永远不会被删除)。但是,vector<string> v;将内存放在堆栈上,并在超出范围时自动删除。

于 2012-08-26T08:16:05.833 回答