【问题标题】:How to change a vector item in C++?如何在 C++ 中更改矢量项?
【发布时间】:2011-11-23 07:54:31
【问题描述】:

我有一个 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?
}

【问题讨论】:

    标签: c++ vector copy


    【解决方案1】:

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

    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 编译器的情况下工作。

    【讨论】:

      【解决方案2】:

      您可以使用参考:

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

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

      【讨论】:

        【解决方案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 的每个元素的更惯用方式。

        【讨论】:

          【解决方案4】:

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

          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;
          }
          

          【讨论】:

            【解决方案5】:

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

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

            【讨论】:

              猜你喜欢
              • 2023-02-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-09
              • 2017-08-05
              相关资源
              最近更新 更多