我的map迭代器不能访问map的每个元素,我该如何修复它?



我需要将map的每个元素(每个pair元素的第一个和第二个)插入到字符串中。我查过的每个解决方案都做了类似的事情:

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<char>::insert(const std::basic_string<char>&)'

如何输出映射的每个元素?特别是在字符串!

对于键和值重载operator<<的一般map,使用stringstream来执行此操作。

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

编译器告诉你哪里出错了。没有匹配的函数调用,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());

"没有匹配的函数调用'std::basic_string::insert(const std::basic_string&)'" -非常正确-参见insert文档。

你可以像Yuushi评论的那样使用append;如果你想添加iter->second,你首先需要将其转换为std::string,可能是boost::lexical_cast<std::string>(iter->second),或者使用std::ostringstream oss; oss << iter->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<<(std::ostream&, const std::map<T, U>&),但如果代码的两个部分有相同的绝妙想法,它可能会变得混乱…更改所使用的分隔符字符串也稍微困难一些,不过您可以添加自己的iomanippers(非常类似于std::fill())。

相关内容

最新更新