我无法在C ++中初始化struct值

时间:2014-03-31 15:42:46

标签: c++ vector struct

我有这个变量:

struct mat{
    int row;
    int column;
};
vector<bool> aux;

在main函数中,我通过这种方式初始化mat的向量:

int main(){
    int n,r,c;
    char s;
    cin >> n;
    vector<mat> matrices = vector<mat> (27);
    aux = vector<bool> (32,false);
    for(int i=0; i<n;++i) {
        cin >> s >> r >> c;
        matrices[s-'A'].row = r;
        matrices[s-'A'].column = c;
        aux[s-'A'] = true;
}

但是当我离开for循环时,我调用了一个在shell中写入向量矩阵的函数:

void writeMatrices(vector<mat>& matrices){
    for(int i = 0; i < aux.size(); ++i){
        if(aux[i]) {
            cout << char ('A'+i) << " Rows: " << matrices[i+'A'].row << " Columns: " << matrices[i+'A'].column << endl;
        }
    }
}

我只获得了0。

有人知道为什么吗?

3 个答案:

答案 0 :(得分:1)

问题是您在读取索引时错误地将'A'的值添加到索引中。 writeMatrices的代码应改为:

void writeMatrices(vector<mat>& matrices){
    for(int i = 0; i < aux.size(); ++i){
        if(aux[i]) {
            cout << char ('A'+i) 
                 // note that the index for matrices should be i, not i+'A' !
                 << " Rows: "    << matrices[i].row 
                 << " Columns: " << matrices[i].column 
                 << endl;
        }
    }
}

与此输入数据一起使用:

6
A 1 2
B 2 3
C 3 4
D 4 5
E 5 6
F 6 7

我们现在得到这个输出:

A Rows: 1 Columns: 2
B Rows: 2 Columns: 3
C Rows: 3 Columns: 4
D Rows: 4 Columns: 5
E Rows: 5 Columns: 6
F Rows: 6 Columns: 7

您的代码中的某些错误检查可以让您更快地发现此问题。

答案 1 :(得分:0)

您的matrices集合有27个元素。您的bool(aux)集合有32个元素,超过了大小或矩阵集合。你的for循环正在执行&#34; n&#34;时间可能是任何取决于输入的东西。您的收集索引器是&#34; s&#39; A&#39;&#34;&#39;我假设你输入的内容类似于&#34; A,B,C,D,......&#34;总而言之,这是一种非常奇怪,随意且不可靠的方式来处理集合。你应该只有1个最大大小和1个循环索引器变量,并将它用于一切。或者从空集合开始并使用&#34; push_back()&#34;添加每个元素。你也可以添加&#34; bool aux&#34;作为你&#34; mat&#34;的成员结构,然后你就不需要一个单独的&#34; aux&#34;集合。

在您提供的代码中也没有任何内容,其中包括&#34; r&#34;和&#34; c&#34;,所以除非这些代码在未显示的代码中设置,否则您只需将行和列字段设置为默认值r和c。

答案 2 :(得分:0)

在for循环中,您使用了矢量矩阵的索引s-'A'

for(int i=0; i<n;++i) {
    cin >> s >> r >> c;
    matrices[s-'A'].row = r;
    matrices[s-'A'].column = c;
    aux[s-'A'] = true;

}

我猜他的值在'A' - 'Z'

范围内

然而,在函数内部使用了索引`i +'A'向量矩阵

cout << char ('A'+i) << " Rows: " << matrices[i+'A'].row << " Columns: " << matrices[i+'A'].column << endl;

我认为向量矩阵中的索引必须与向量aux中的索引相符。这是函数的主体应该看起来像

void writeMatrices( const vector<mat> &matrices )
{
    for ( std::vector<bool>:size_type i = 0; i < aux.size(); ++i )
    {
        if( aux[i] ) 
        {
            cout << char ('A'+i) << " Rows: " << matrices[i].row << " Columns: " << matrices[i].column << endl;
        }
    }
}

我认为容器std::map<char, mat>更适合您的任务。