c++ - 如何更改 C++ 中的 vector 项?

标签 c++ vector copy

我有一个 C++ 结构 vector ,我想单独修改每个项目。我发现执行 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?
}

最佳答案

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

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++ - 如何更改 C++ 中的 vector 项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8238806/

相关文章:

javascript - 如何在不同的文本区域显示用户的输入?

file - 复制包含在不同父文件夹中的许多文件(同名)

c++ - 无效的对象访问 C++

c++ - 具有关联值的枚举

c++ - 如何在 C++ 中获取文件时间

java - HashSet 并在 JList 上显示

vector - 我如何在 Rust 中获取 Vec<T> 的一部分?

r - 如何将向量转换为R中的列表?

c++ - 奇怪的枚举名称冲突

C++ 成员函数指针,boost::signals