指向字符串变量的指针失败

时间:2016-02-07 21:53:01

标签: c++ pointers

match give_word(
    const vector< vector<string> > * source_words,
    const vector< vector<string> > * target_words, ...)
{
    string synonym1, synonym2;
    ...
    // choose synonyms (if available)
    synonym1=source_words[index][rand()%source_words[index].size()];
    synonym2=target_words[index][rand()%target_words[index].size()];
    ...

我已做出技术决定,将所有矢量矢量对象作为指针传递,因为我不希望它们被复制并传递给函数。这是因为这些向量通常包含超过1000个字符串。

但我不明白为什么我在这两行关于作业符号(=)

的编译错误
synonym1=source_words[index][rand()%source_words[index].size()];
synonym2=target_words[index][rand()%target_words[index].size()];

它说: 没有操作员&#34; =&#34;匹配这些操作数

2 个答案:

答案 0 :(得分:2)

synonym1 = source_words[index][rand() % source_words[index].size()];
synonym2 = target_words[index][rand() % target_words[index].size()];
如果您使用了,那么

将是一个有效的代码>

至于指针,你需要这个:

synonym1 = (*source_words)[index][rand() % (*source_words)[index].size()];
synonym2 = (*target_words)[index][rand() % (*target_words)[index].size()];

这称为解除引用(括号用于正确的运算符关联)。

没有它,指针会被[index]取消(UB,如果index != 0),但幸运的是,它没有编译,因为你最终将std::vector<std::string>分配给{{ 1}}。

同样地,对于std::string,您获得source_words[index].size()而不是std::vector<std::vector<std::string>>的大小。

答案 1 :(得分:1)

每当有机会使用引用而不是指针时,请继续执行此操作。

请注意,如果在某些时候,您必须使用指向矢量的指针,则可以始终使用at函数,如

synonym1 = source_words->at(index)[rand() % source_words->at(index).size()];
synonym2 = target_words->at(index)[rand() % target_words->at(index).size()];

我知道有些人更喜欢像myfunc(&vector)一样打电话(以某种方式&#34;明确表示&#34;被调用的函数将修改矢量),这样就可以了使用指向向量的指针,或者在LogicStuff指出时取消引用指针,然后使用[]运算符。

一个非常重要的事实是,at函数会检查&#34; index&#34;是否有效,而operator []没有。

相关问题