我正在尝试这个代码,但是一直在发生的事情是,当我插入向量时,引用不会改变。例如,在第一次插入向量时,所有11个元素将同等地改变,包括temp_word。这是预期的行为吗?
std::cout << "Searching for the top 10 scrabble scores" << std::endl;
Word temp_word;
std::vector<std::pair<Word&, unsigned>> word_scores;
for(unsigned x = 0; x < 10; ++x)
word_scores.push_back({temp_word, 0});
for(Word& word : dict.words()){
auto score = word.CalculateScrabbleScore();
for(unsigned x = 0; x < 10; ++x){
if(word_scores[x].second <= score){
// Insert into the list of scores
word_scores.insert(word_scores.begin() + x, {word , score});
// Remove what was pushed off the list
word_scores.erase(word_scores.begin() + 10);
break;
}
}
}
答案 0 :(得分:2)
当std::pair
包含引用类型的成员时,其复制构造函数与其赋值运算符之间存在非常明显的差异。考虑:
int n = 42;
std::pair<int&, int> p1{n, 0};
std::pair<int&, int> p2(p1);
assert(&p1.first == &p2.first);
p1.first
和p2.first
现在都引用n
。比较和对比:
int n = 42;
std::pair<int&, int> p1{n, 0};
int m = 84;
std::pair<int&, int> p2{m, 0};
p2 = p1;
assert(m == n);
p1.first
仍然引用n
,p2.first
仍引用m
,但现在m
的值与n
相同。< / p>
初始化时绑定引用,之后不能反弹。对引用的赋值实际上分配给底层对象。
vector::insert
可以合法地使用复制构造函数,赋值运算符或两者的任意组合来移动元素。在你的例子中发生的是vector::insert
首先将元素移开(可能通过赋值,但这并不重要),然后分配给“空”点。但那个地方并不是真的空洞 - 它仍然保留着它的原始元素。在此作业中,temp_word
被修改,与m
在我之前的示例中p2 = p1;
修改的方式相同。