c++:向量<string>的迭代
Posted
技术标签:
【中文标题】c++:向量<string>的迭代【英文标题】:c++: Iteration of vector<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
请帮帮我,告诉我原因,谢谢!
【问题讨论】:
用圆括号调用at
:at(j)
或者根本不要使用at
。我从来没有发现它的语义是合适的(尤其是std::string
)。
@JamesKanze:使用矢量,有时at()
是有用的并且是需要的。
@JamesKanze:std::string
上让您担心的具体语义点是什么?我通常建议使用at()
而不是[]
来防止越界方面。
@Nawaz 是的。如果您打算捕获异常并对其进行处理,那么无论如何,at
是解决方案。但在实际应用中要小心。如果边界检查错误是实际错误(违反先决条件),您不想展开堆栈(可能已损坏);你想摆脱执行尽可能少的代码的过程。如果内部状态损坏,即使执行析构函数也可能使事情变得更糟。
【参考方案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;
【讨论】:
以上是关于c++:向量<string>的迭代的主要内容,如果未能解决你的问题,请参考以下文章