【问题标题】:Unable to assign strings to a vector of vectors无法将字符串分配给向量的向量
【发布时间】:2020-03-17 13:47:30
【问题描述】:

我正在尝试在散列时用 C++ 编写代码。为此,我试图将字符串推入向量向量中。但它显示了分段错误。

#include <bits/stdc++.h>

using namespace std;

int main() {
int n,ind,inr;
cin >> n;
int j=0;    
vector<string> a;
vector<vector <string>> v(n);
for(int i=0;i<n;i++)
{
    v.push_back(a);
}                   
for(int i=0;i<n;i++)
{
    int m;
    string name;
    cin>>m;
    cin>>name;
    ind=m%2039;
        v[ind][j]=name;
    j=0;
    cout<<name<<endl;
}
}

【问题讨论】:

  • 问问自己,v 中嵌套向量的大小是多少(或者换一种说法:a 的大小是多少)?
  • j 总是零???
  • 不仅如此,您还会惊讶地发现v 的大小不是n 值,而是两倍。就段错误而言,它们有很多不同的原因,在这里,很难决定从哪里开始。
  • v.at(ind).at(j) 会很快暴露问题。

标签: c++ string vector


【解决方案1】:

对于初学者来说,向量v 的子向量都没有元素。

在此声明中

vector<vector <string>> v(n);

声明了一个带有 n 个空子向量的向量。

然后在这个循环中

for(int i=0;i<n;i++)
{
    v.push_back(a);
} 

您正在向向量 v 追加一个 n 个空子向量。因此,向量v 有 2 * n 个空子向量。

在此声明中

ind=m%2039;

使用了一个幻数2039。表达式的结果

m%2039

可以大于或等于 2 * n。

所以在这个声明中

v[ind][j]=name;

同时使用这两个索引(尤其是对于向量 v 的空子向量)会导致未定义的行为。

您可以使用标准容器 std::map 声明而不是子向量,例如

std::map<unsigned int, std::vector<std::string>> m;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-23
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 2019-02-08
    • 2011-05-11
    相关资源
    最近更新 更多