首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c++循环std::vector<std::map<std::string,std::string> >

c++循环std::vector<std::map<std::string,std::string> >
EN

Stack Overflow用户
提问于 2015-02-12 13:37:58
回答 2查看 1.1K关注 0票数 0

如何循环执行此操作?

我已经试过了:

代码语言:javascript
运行
复制
//----- code
std::vector<std::map<std::string, std::string> >::iterator it;
for ( it = users.begin(); it != users.end(); it++ ) {
    std::cout << *it << std::endl; // this is the only part i changed according to the codes below
}
//----- error
error:   initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = std::map<std::basic_string<char>, std::basic_string<char> >]’

//----- code
std::cout << *it["username"] << std::endl;
//----- error
note:   template argument deduction/substitution failed:
note:   ‘std::map<std::basic_string<char>, std::basic_string<char> >’ is not derived from ‘const std::complex<_Tp>’
//----- code
std::cout << *it->second << std::endl; // also tried with parenthesis - second()
//----- error
error: ‘class std::map<std::basic_string<char>, std::basic_string<char> >’ has no member named ‘second’
//----- code
for( const auto& curr : it ) std::cout <<  curr.first() << " = " << curr.second() << std::endl;
//----- error
error: unable to deduce ‘const auto&’ from ‘<expression error>’

最后,

代码语言:javascript
运行
复制
//----- code
std::map<std::string, std::string>::iterator curr, end;
for(curr = it.begin(), end = it.end();  curr != end;  ++curr) {
    std::cout <<  curr->first << " = " << curr->second << std::endl;
}
//----- error
‘std::vector<std::map<std::basic_string<char>, std::basic_string<char> > >::iterator’ has no member named ‘begin‘ & ‘end’

我希望我能给出一个清晰的细节..上面是代码,下面是错误..现在我的大脑是一片空白。

对此我很抱歉..

我已经让它在这种类型上工作:std::map<int, std::map<std::string, std::string> >和im尝试使用向量作为一个选项。

EN

回答 2

Stack Overflow用户

发布于 2015-02-12 13:47:53

您用于迭代的代码是正确的;问题在于您的输出语句。你的代码是这样做的:

代码语言:javascript
运行
复制
std::cout << *it << std::endl;

在本例中,*it指的是std::map<string,string>,而std::cout不知道如何输出映射。也许你想要这样的东西:

代码语言:javascript
运行
复制
std::cout << (*it)["username"] << std::endl;

确保在*it周围使用(),否则会出现运算符优先级问题。

票数 2
EN

Stack Overflow用户

发布于 2015-02-12 13:53:21

代码语言:javascript
运行
复制
std::vector<std::map<std::string, std::string> >::iterator it;
for ( it = users.begin(); it != users.end(); it++ ) {
    std::cout << *it << std::endl;

users不是.empty()时,上面的<<操作符会尝试流式传输一个std::map<std::string, std::string>对象,但是标准库并没有为流式映射提供重载:它如何知道键和值之间以及元素之间需要什么分隔符?

我建议你这样分解这个问题:

代码语言:javascript
运行
复制
std::vector<std::map<std::string, std::string> >::iterator it;
for ( it = users.begin(); it != users.end(); it++ )
{
    std::map<std::string, std::string>& m = *it;

    for (std::map<std::string, std::string>::iterator mit = m.begin();
         mit != m.end(); ++mit)
        std::cout << mit->first << '=' << mit->second << '\n';

    std::cout << "again, username is " << m["username"] << '\n';
}

这可以在C++11中简化:

代码语言:javascript
运行
复制
for (auto& m : users)
    for (auto& kv : m)
        std::cout << kv.first << '=' << kv.second << '\n';
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28470087

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档