std :: vector引用被复制到.insert()

时间:2015-05-13 08:49:10

标签: c++ stl

我正在尝试这个代码,但是一直在发生的事情是,当我插入向量时,引用不会改变。例如,在第一次插入向量时,所有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;
        }
    }
}

1 个答案:

答案 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.firstp2.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仍然引用np2.first仍引用m,但现在m的值与n相同。< / p>

初始化时绑定引用,之后不能反弹。对引用的赋值实际上分配给底层对象。

vector::insert可以合法地使用复制构造函数,赋值运算符或两者的任意组合来移动元素。在你的例子中发生的是vector::insert首先将元素移开(可能通过赋值,但这并不重要),然后分配给“空”点。但那个地方并不是真的空洞 - 它仍然保留着它的原始元素。在此作业中,temp_word被修改,与m在我之前的示例中p2 = p1;修改的方式相同。