【问题标题】:c++: Iteration of vector<string>c++:向量<string>的迭代
【发布时间】:2013-10-17 08:41:52
【问题描述】:
#include <iostream>
#include <vector>
#include <string>

using namespace std;

int main()
{
    vector<string>  a;
    a.push_back("1 1 2 4");
    a.push_back("2 3 3 3");
    a.push_back("2 2 3 5");
    a.push_back("3 3 3 3");
    a.push_back("1 2 3 4");
    for (int i=0;i<a.size();i++)
        for(int j=0;j<a[i].length();j++)
            cout<<a[i].at[j];
    return 0;
}

您好,运行上面的代码时,出现如下错误:

error C2109: subscript requires array or pointer type

请帮帮我,告诉我原因,谢谢!

【问题讨论】:

  • 用圆括号调用atat(j)
  • 或者根本不要使用at。我从来没有发现它的语义是合适的(尤其是std::string)。
  • @JamesKanze:使用矢量,有时at() 是有用的并且是需要的。
  • @JamesKanze:std::string 上让您担心的具体语义点是什么?我通常建议使用at() 而不是[] 来防止越界方面。
  • @Nawaz 是的。如果您打算捕获异常并对其进行处理,那么无论如何,at 是解决方案。但在实际应用中要小心。如果边界检查错误是实际错误(违反先决条件),您不想展开堆栈(可能已损坏);你想摆脱执行尽可能少的代码的过程。如果内部状态损坏,即使执行析构函数也可能使事情变得更糟。

标签: c++ string vector iteration


【解决方案1】:

at是一个函数,需要用()而不是[]调用

更新

cout<<a[i].at[j];
//           ^^^

a[i].at(j)
//   ^^^^^

要输出string,你不需要cout每个字符,只需这样做

for (int i=0; i<a.size(); i++)
{
   std::cout << a[i] << "\n";
}
std::cout << std::endl;

或者如果是 C++11:

for(auto const & s : a)
{
   cout << s << "\n";
}

【讨论】:

    【解决方案2】:

    使用基于范围的 for 语句更简单。例如

    for ( const std::string &s : a )
    {
        for ( char c : s ) std::cout << c;
        std::cout << std::endl;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-11-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-10
      • 1970-01-01
      相关资源
      最近更新 更多