如何更改此向量函数以接受更多元素? [复制]

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' to 'char' for argument '2' to 'std::vector<:basic_string> > split(const string&, char)' @user1587149:您确实两个函数都粘贴到了文件中,对吧? @user1587149:只是一个提示;您可能想尝试了解那里发生了什么,而不仅仅是复制/粘贴此处呈现给您的所有内容。 如何更改代码,使分隔符不会被固定为 '#' ,有时我可能会使用其他分隔符。【参考方案3】:

嗯,你知道的,看看push_back 成员函数……

【讨论】:

我知道有这样的功能,但是我如何在上面的矢量函数中使用它,以使其能够在任何元素大小下都一样灵活地工作。 @user1587149:查找该函数的文档。试试看。

以上是关于如何更改此向量函数以接受更多元素? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何通过将向量元素传递给函数来更改它们

如何更改函数中的向量名称? [复制]

C++:指向向量(及其元素)的指针是不是稳定,因为随着向量的增长,向量将在内存中迁移以适应更多元素? [复制]

扩展 $.mobile.changePage 以接受更多选项?

Jquery - 追加后执行回调

在 R 中,如何选择和应用函数向量的元素?