繁体   English   中英

返回向量 <string> 在C ++中

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM