在c ++中返回vector <string> </string>

时间:2012-08-25 15:45:17

标签: 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|

我不知道为什么。该函数假设返回字符串的向量,它确实使用了所有这些*&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>();
堆栈前的

类型说明符; ////////////////

4 个答案:

答案 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;将内存放在堆栈上,并在超出范围时自动删除。