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;匹配这些操作数
答案 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 []
没有。