如何在C ++中更改矢量项?

时间:2011-11-23 07:54:32

标签: c++ vector copy

我在C ++中有一个结构的向量,我想单独修改每个项目。我发现做SomeStruct info = myVector[i]给了我一个项目的副本,所以如果我修改它什么都不会改变。所以现在我正在重置这样的项目:myVector[i] = info。有没有更有效的方法呢?一个不涉及复制操作的人?

这是我目前的代码:

struct CharacterInfo {
    QChar character;
    int occurrences;
    double frequency;
};

std::vector<CharacterInfo> characterInfos;

// Some code to populate the vector

for (unsigned i = 0; i < characterInfos.size(); i++) {
    CharacterInfo info = characterInfos[i];
    info.frequency = (double)info.occurrences / (double)totalOccurrences;
    characterInfos[i] = info; // how to avoid this?
}

5 个答案:

答案 0 :(得分:12)

不会改变太多代码的最简单方法就是使用引用而不是实例。所以:

SomeStruct & info = myVector[i];

下一个最简单的方法是改变使用带索引的循环,如:

for (std::vector<SomeStruct>::iterator it = myVector.begin(); it != myVector.end(); ++it)
{
    SomeStruct & info = *it;
    // do stuff here
}

使用STL你可以更进一步,特别是如果你有一个支持C ++ 11的编译器,例如:

std::for_each(std::begin(myVector), std::end(myVector), [](SomeStruct & info) { /* do stuff here */ });

也与你的问题没有直接关系,但如果你在计算频率的结构中添加一个方法,那么代码会变得更加清晰,例如你可以做的最后一个例子:

std::for_each(std::begin(myVector), std::end(myVector), std::mem_fun(&SomeStruct::calculateFrequency));

如果您使用std::begin(myVector)将调用更改为myVector.begin(),并且结束时调用相同,则此操作也可以在没有C ++ 11编译器的情况下运行。

答案 1 :(得分:8)

您可以使用参考:

CharacterInfo& info = characterInfos[i];
info.frequency = (double)info.occurrences / (double)totalOccurrences;

引用info绑定到向量的元素。如果你改变它,你就改变了 矢量元素也是。

答案 2 :(得分:3)

您可以使用STL迭代器迭代向量:

for (vector<CharacterInfo>::iterator it = characterInfos.begin();
        it != characterInfos.end(); ++it) {
    it->frequency = (double)it->occurrences / totalOccurrences;
}

在循环中,it是一个迭代器,它与指向CharacterInfo结构的指针具有基本相同的功能和接口:http://cplusplus.com/reference/std/iterator/RandomAccessIterator/

如果您不需要知道每个元素的索引,那么使用迭代器循环是迭代std::vector的每个元素的更惯用的方法。

答案 3 :(得分:1)

我不确定我理解你的问题,但我认为你是在尝试这样做?

for (unsigned i = 0; i < characterInfos.size(); i++) {
    characterInfos[i].frequency = (double)characterInfos[i].occurrences / (double)totalOccurrences;
}

另一种选择是使用迭代器:

for(std::vector<CharacterInfo>::iterator it = characterInfos.begin(); it != characterInfos.end(); ++it){
    it->frequency = (double)it->occurences / (double)totalOccurences;
}

答案 4 :(得分:0)

哇,这是一个非常老的问题。对于“较新的” c ++,也可以使用Range-based for loop (since C++11)

for(auto &characterInfo : characterInfos) {
    characterInfo.frequency = characterInfo.occurences / static_cast<double>(totalOccurences);
}