【问题标题】:My map iterator is not working to access each element of the map, how do I fix it?我的地图迭代器无法访问地图的每个元素,我该如何解决?
【发布时间】:2014-09-21 15:29:39
【问题描述】:

我需要将地图的每个元素(每对元素的第一个和第二个元素)插入到一个字符串中。我查找的每个解决方案都与此类似:

for(map<string, int>::iterator iter = theMap.begin(); iter != theMap.end(); ++iter)
{
  myString.insert(iter->first);
  myString.insert(iter->first);
}

我不断收到错误消息说no matching function for call to 'std::basic_string&lt;char&gt;::insert(const std::basic_string&lt;char&gt;&amp;)'

如何输出地图的每个元素?特别是在字符串中!

【问题讨论】:

  • 你想把它附加到myString吗?
  • 是的,我想将每对映射的两个元素(键和值)都添加到 myString 上。
  • 那么你会想要使用append: en.cppreference.com/w/cpp/string/basic_string/append
  • 如果你真的认为你不能用迭代器访问地图的元素,那么测试一下,而不是插入一些字符串。

标签: c++ string map insert iterator


【解决方案1】:

使用stringstream 为一般map 执行此操作,其中键和值重载operator&lt;&lt;

stringstream makeMyString;
for(map<string, int>::iterator iter = theMap.begin(); iter != theMap.end(); ++iter)
{
  makeMyString << iter->first << " " <<iter->second;
}
string myString = makeMyString.str();

【讨论】:

    【解决方案2】:

    编译器会告诉你哪里出了问题。没有匹配的函数调用,insert 通常是insert(position, string)

    因此,您可以执行以下操作:

    stringstream stringmaker;
    stringmaker << iter->first << iter->second; //You need to do this to convert your
                                                // int key into a string.
    
    myString.insert(myString.size(), stringmaker.str())
    

    或更好

    myString.append(stringmaker.str());
    

    【讨论】:

      【解决方案3】:

      “没有用于调用 'std::basic_string::insert(const std::basic_string&)' 的匹配函数” - 非常正确 - 参见 insert docs

      你可以像 Yuushi 所说的那样使用 append;如果您想附加iter-&gt;second,您首先需要将其转换为std::string,可能使用boost::lexical_cast&lt;std::string&gt;(iter-&gt;second),或使用std::ostringstream oss; oss &lt;&lt; iter-&gt;second; myString.append(oss.str());

      或者,您可以使用流式传输,在这种情况下,最灵活的方法是首先编写一个将std::map 输出到std::ostream 的函数,然后将其应用于std::ostringstream,然后调用.str() 到获取std::string 版本:

      void output_iterator_over_pairs(std::ostream& os, Iterator begin, Iterator end,
                                      const char* between_pairs = ", ",
                                      const char* inside_pairs = ":')
      {
          for (bool first = true; begin != end; ++begin)
          {
              if (first) first = false; else os << between_pairs;
              os << begin->first << inside_pairs << begin->end;
          }
      }
      

      然后你可以这样做:

      std::ostringstream oss;
      output_iterator_over_pairs(oss, theMap.begin(), theMap.end());
      // use oss.str()...
      

      您实际上可以重载operator&lt;&lt;(std::ostream&amp;, const std::map&lt;T, U&gt;&amp;),但是如果代码的两个部分具有相同的绝妙想法,它可能会变得混乱......也很难改变使用的分隔符字符串,尽管您可以通过一些工作添加自己的 iomanipulators (很像std::fill())。

      【讨论】:

        猜你喜欢
        • 2014-07-26
        • 1970-01-01
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-14
        • 2016-03-18
        相关资源
        最近更新 更多