无法将字符串分配给向量的向量

Posted

技术标签:

【中文标题】无法将字符串分配给向量的向量【英文标题】: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 总是零??? 顺便说一句:***.com/questions/31816095/… 不仅如此,您还会惊讶地发现v 的大小不是n 值,而是两倍。就段错误而言,它们有很多不同的原因,在这里,很难决定从哪里开始。 v.at(ind).at(j) 会很快暴露问题。 【参考方案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;

【讨论】:

以上是关于无法将字符串分配给向量的向量的主要内容,如果未能解决你的问题,请参考以下文章

通过分配字符串向量创建具有列名的空数据框? [复制]

将字符串*分配给char * c ++ [关闭]

将 unsigned int(使用 .size())分配给一维浮点向量

将字符串变量分配给unsigned char变量

Cython:无法分配给二维向量

用字符串向量分配字符串向量的向量