如何更改此向量函数以接受更多元素? [复制]
Posted
技术标签:
【中文标题】如何更改此向量函数以接受更多元素? [复制]【英文标题】:How do I change this vector function to accept more elements? [duplicate] 【发布时间】:2012-08-12 07:59:15 【问题描述】:可能重复:Splitting a string in C++
我从我的问题中得到的一个答案中得到了这个向量函数
vector<string> split(const string& s, char delim)
vector<string> elems(2);
string::size_type pos = s.find(delim);
elems[0] = s.substr(0, pos);
elems[1] = s.substr(pos + 1);
return elems;
但是,它只接受 2 个元素。如何根据字符串 s 中存在多少 delimiter 来修改接受?
例如,如果我有这个:
user#password#name#fullname#telephone
有时大小可能会有所不同。
我怎样才能让这个函数不管有多少元素都可以灵活地工作,并且能够像上面的这个函数一样拆分?
只是为了进一步解释我的问题:
我想要实现的是使用这个向量函数进行分割的能力,它的分隔符与 N 大小相同,而不是固定在大小 2。
这个函数最多只能拆分一个字符串中的2个元素,超过这个会导致Segmentation core dump
和以前一样,我只需要像
这样的用法user:pass
现在我添加了更多属性,所以我需要能够拆分
user:pass:name:department
其中 x[2] 和 x[3] 将分别返回姓名和部门
他们都将使用相同的分隔符。
进一步更新:
我尝试使用以下答案之一提供的此功能
vector<string> split(const string& s, char delim)
bool found;
vector<string> elems;
while(1)
string::size_type pos = s.find(delim);
if (found==string::npos)break;
elems.push_back(s.substr(0, pos));
s=s.substr(pos + 1);
return elems;
我得到了一些错误
server.cpp: In function ‘std::vector<std::basic_string<char> > split(const string&, char)’:
server.cpp:57:22: error: passing ‘const string aka const std::basic_string<char>’ as ‘this’ argument of ‘std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::operator=(const std::basic_string<_CharT, _Traits, _Alloc>&) [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>, std::basic_string<_CharT, _Traits, _Alloc> = std::basic_string<char>]’ discards qualifiers [-fpermissive]
【问题讨论】:
不,这不是 that 问题的重复。毫无疑问,其他人也问过同样的问题。但在找到这样的问题之前,请不要以“我不明白这个问题”为由投票结束 @close-voters:有什么急事?做些积极的事吧! 不确定你想做什么。您是否想要一组允许的分隔符,以便将user#password@name@fullname
与分隔符集 #@
分开会产生 4 个元素?请澄清。
嗯,你想做'n'次,这意味着你写了一个循环。您想将项目添加到向量中,因为您使用 vector::push_back。您已经有了在字符串中查找字符并拆分字符串的方法。只需以正确的方式将它们组合在一起即可。这是正常的编程。自己尝试一下,如果您遇到困难,请发布您的尝试,有人会提供帮助。您将通过这种方式了解更多信息。
重复...阅读这篇文章:***.com/questions/236129/splitting-a-string-in-c
【参考方案1】:
类似的东西 %)
vector<string> elems;
while(1)
string::size_type pos = s.find(delim);
if (found==string::npos)break;
elems.push_back(s.substr(0, pos));
s=s.substr(pos + 1);
if(s.size())elems.push_back(s);
return elems;
【讨论】:
如何在函数中使用它? 我觉得这个算法漏掉了最后一个token。 天哪,你真的很想把它放在盘子里,不是吗。您是否无法将该代码包装在函数中?将上面的代码与您之前给出的函数进行比较。这并不难,你可能会学到一些东西。 @juanchopanza 我预测几天后会有另一个问题。 '我在之前的问题中被赋予了这个功能,但是......'。对不起 user1587149,但在某些时候,如果你想学习编程,你至少得开始尝试自己做事。 @jahhaj 是的,我可以看到这个问题再次困扰我们:-)【参考方案2】:几乎重复的有one answer 提供通用拆分功能:
std::vector<std::string> split(std::string const& str, std::string const& delimiters = "#")
std::vector<std::string> tokens;
// Skip delimiters at beginning.
string::size_type lastPos = str.find_first_not_of(delimiters, 0);
// Find first "non-delimiter".
string::size_type pos = str.find_first_of(delimiters, lastPos);
while (string::npos != pos || string::npos != lastPos)
// Found a token, add it to the vector.
tokens.push_back(str.substr(lastPos, pos - lastPos));
// Skip delimiters. Note the "not_of"
lastPos = str.find_first_not_of(delimiters, pos);
// Find next "non-delimiter"
pos = str.find_first_of(delimiters, lastPos);
return tokens;
可以很容易地包裹到:
std::vector<std::string> split(std::string const& str, char const delimiter)
return split(str,std::string(1,delimiter));
【讨论】:
server.cpp:在函数'int main()'中:server.cpp:152:46:错误:从'char'到'const char*'的无效转换[-fpermissive] server.cpp: 在函数'std::vector<:basic_string> > split(const string&, char)': server.cpp:50:44: error: cannot convert ' std::string aka std::basic_string嗯,你知道的,看看push_back
成员函数……
【讨论】:
我知道有这样的功能,但是我如何在上面的矢量函数中使用它,以使其能够在任何元素大小下都一样灵活地工作。 @user1587149:查找该函数的文档。试试看。以上是关于如何更改此向量函数以接受更多元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]