【问题标题】:get first character of a string from a string vector从字符串向量中获取字符串的第一个字符
【发布时间】:2015-05-21 15:45:49
【问题描述】:

如何获取第一个字符或如何在遍历该向量时从字符串向量中的字符串按索引获取字符。 这是我的代码:

vector<string>::iterator i=vec.begin();
    while(i!=vec.end()){
        if(i[0]==ch)
            cout<<"output";
    }

它给出了错误:

'operator==' 不匹配(操作数类型为 'std::basic_string' 和 'char')|

【问题讨论】:

  • 而不是您的 while 循环使用范围基于 for,例如for( const string&amp; s : vec ) { if( s.length() &gt; 0 &amp;&amp; s[0] == ch )

标签: c++ string c++11 vector stl


【解决方案1】:

试试下面的

vector<string>::iterator i=vec.begin();
    while(i!=vec.end()){
        if(i[0][0] == ch)
            cout<<"output";
        ++i;
    }

i[0] 返回迭代器 i 指向的整个字符串,而 i[0][0] 返回字符串的第一个字符,即使字符串为空(在这种情况下,值将是 '\0')。 :)

但你可以写得更简单

for ( const std::string &s : vec )
{
    if ( s[0] == ch ) cout << "output";
}

如果你想使用一些可以有任何值的索引,那么代码可能看起来像

vector<string>::iterator i=vec.begin();
    while(i!=vec.end()){
        if( index < i[0].size() && i[0][index] == ch)
            cout<<"output";
        ++i;
    }

或者

for ( const std::string &s : vec )
{
    if ( index < s.size() && s[index] == ch ) cout << "output";
}

【讨论】:

  • 我会说(*i) 而不是i[0]。同样,i-&gt;size().
  • @Hurkyl 我在使用表达式 i[0] 时显示了正确的语法和语义。:)
  • 您在使用while 语法时缺少++i;
  • @Jerome L 这不是我。:) 是线程的作者错过了 ++i。我只是复制了他的代码以显示正确的表达式。:)
【解决方案2】:

我根本不会在这里编写循环,而是使用标准算法。例如,要显示以指定字母开头的所有字符串(每行一个),您可以使用如下内容:

std::copy_if(vec.begin(), vec.end(), 
             std::ostream_iterator<std::string>(std::cout, "\n"),
             [ch](std::string const &s) { return s[0] == ch; });

【讨论】:

    【解决方案3】:

    要获取向量的索引k 处的字符串,下面的代码应该可以工作:

    vector<string>::iterator i = vec.begin();
    while (i != vec.end())
    {
      if (i - vec.begin() == k)
        cout << (*i) << endl;
      ++i;
    }
    

    要从该字符串中获取字符,您可以在适当的位置取消引用。

    【讨论】:

    • 我在这里遗漏了什么吗,或者你可以写vec[k]而不是整个代码块?
    • 这没有回答问题。所有这一切都会以一种迂回且低效的方式打印出向量中的第 k 个字符串。相当于cout &lt;&lt; vec[k] &lt;&lt; endl;
    • 确实如此。但是,我觉得这个人除了简单的取消引用之外可能还有其他用途,并将此查询作为示例。所以,我认为最好按照他的意愿使用循环。
    【解决方案4】:

    i 是一个序列的迭代器,而不是序列的元素i 就像一个指针;你需要做*i 来获取迭代器指向的元素。例如(*i)[0]i 指向的字符串的第一个字符(当然,假设它是非空的——如果它是空的,那么这是未定义的行为,可能会发生各种可怕的事情)。

    另外,您似乎忘记了实际迭代您的序列;例如在每次迭代结束时以++i 推进。

    除非您特别需要使用迭代器,否则您可能应该更喜欢类似的东西

    for(std::string &s : vec) {
        // do something with s
    }
    

    (或更简单地说,auto &amp;s : vec

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-08
      • 2018-07-11
      相关资源
      最近更新 更多