【问题标题】:access first letter of a string in a set c++访问集合c ++中字符串的第一个字母
【发布时间】:2013-09-02 11:33:17
【问题描述】:

我有一组字符串,我需要访问每个字符串并将字符串的第一个字母与一个字符进行比较,如果它们相同则停止。我该如何度过呢?我试过了

char* p;

for (std::set<string>::iterator iter=myset.begin(); iter!=myset.end();iter++)
    {p = *iter;
    if (p==characterForComparison) return 0;
    }

但这并没有通过编译器,它说

error C2440: '=' : cannot convert from 'std::basic_string<_Elem,_Traits,_Ax>' to 'char *'

我该如何解决这个问题?我需要的是相当简单的,所以我需要一个尽可能简单的解决方案,只需遍历所有字符串,比较第一个字母,如果它们相同,则返回0;

【问题讨论】:

  • characterForComparison 是 char * 还是单个 char?错误说 char *
  • 取消引用的迭代器 (*iter) 指向 std::string 而不是 char*,因此您不能将 std::string 分配给 char*。尝试类似:char p = (*iter)[0].

标签: c++ string iterator set


【解决方案1】:

要比较std::string 的第一个字符,只需:

if (!(*iter).empty() && 
    (*iter)[0] == characterForComparison)
{
}

要访问字符串中的第一个元素,字符串提供operator[]front(),或使用begin 来获取对第一个元素的引用。请参阅std::string 页面。

【讨论】:

  • @WhozCraig 令人惊奇的是,似乎没有其他人使用过它。它应该是自动的。 (当然,你也可以在空的测试之后写iter-&gt;front() == characterForComparison,至少在C++11中,或者*iter-&gt;begin() == characterForComparison
【解决方案2】:

由于您的集合包含std::strings,取消引用迭代器会给您一个string,而不是它的第一个字符。请改用运算符[]

p = (*iter)[0];

【讨论】:

    【解决方案3】:

    *iter是字符串,试试

    char p;
    //...
    p = (*iter)[0]
    

    【讨论】:

      【解决方案4】:

      你有两个问题。第一个是您尝试将std::string 对象分配给char*。第二个是如果你想要第一个字符,那么p应该被声明为一个字符而不是一个指向字符的指针。

      当然,实际上没有必要将字符存储在像p 这样的临时变量中,至少在像你这样简单的情况下不需要。直接从字符串中使用它,如

      if ((*iter)[0] == characterForComparison) { /* do something */ }
      

      【讨论】:

        【解决方案5】:

        如果你可以使用 C++11:

        for(auto s : myset)
        {
          if(s[0] == characterForComparison)
          {
             return 0;
          }
        }
        

        【讨论】:

          【解决方案6】:

          C++ 字符串不能转换为 C 风格的字符串。 *iter 给你一个 C++ 字符串。

          如果你想实际比较一个字符串的第一个字符,那么。

          if ((*iter)[0] == 'a')
          

          会成功的。

          如果你真的需要const char *,你可以使用:

          p = iter->c_str();
          

          但是请注意,这是一个 CONSTANT 字符串,您不应该修改它。

          【讨论】:

            【解决方案7】:

            您也可以使用 STL 算法。 如果可以使用 C++11:

            bool set_condition(const char c, const set<string>& s)
            {
                auto position = 
                    find_if(s.cbegin(), s.cend(), [c](const string& s) { return s[0] == c; } );
            
            
                return (position != s.cend() ); 
            }
            

            【讨论】:

              【解决方案8】:

              尝试将 char 包装在 std:string 的实例中:

              std:string comp(characterForComparison);
              

              用 [0] 检索第一个字符

              【讨论】:

              • 为什么要将字符包裹在字符串中?
              • @interjay 把它拿出来(看到答案的最后一行?)=P
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-11-20
              • 1970-01-01
              • 2018-09-18
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多