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

lau*_*ent 4 c++ copy vector

我在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?
}
Run Code Online (Sandbox Code Playgroud)

Dae*_*min 12

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

SomeStruct & info = myVector[i];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

std::for_each(std::begin(myVector), std::end(myVector), std::mem_fun(&SomeStruct::calculateFrequency));
Run Code Online (Sandbox Code Playgroud)

如果您将调用更改为std::begin(myVector)with myVector.begin()而对于end 更改,则在没有C++ 11编译器的情况下也可以使用它.


Gun*_*iez 8

您可以使用参考:

CharacterInfo& info = characterInfos[i];
info.frequency = (double)info.occurrences / (double)totalOccurrences;
Run Code Online (Sandbox Code Playgroud)

引用info绑定到向量的元素.如果更改它,也可以更改矢量元素.