我的地图迭代器无法访问地图的每个元素,我该如何解决?

时间:2014-07-30 05:12:53

标签: c++ string map insert iterator

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

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>&)'

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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());

答案 2 :(得分:1)

“没有匹配函数来调用'std :: basic_string :: insert(const std :: basic_string&amp;)'” - 非常正确 - 请参阅insert docs

你可以使用追加作为Yuushi评论;如果您要追加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>&)但是如果代码的两个部分有相同的好主意它可能会变得混乱......稍微更难改变使用的分隔符字符串,尽管你可以添加自己的iomanipulator很少工作(很像std::fill())。