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

如何更改C++;? 我有C++的结构向量,我想单独修改每个项目。我发现做SomeStruct info=myVector[I]会给我一个项目的副本,所以如果我修改它,什么都不会改变。所以现在我正在像这样重置项:myVector[I]=info。有没有更有效的方法?一个不涉及复制操作的,c++,vector,copy,C++,Vector,Copy,这是我当前的代码: 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++) {

这是我当前的代码:

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?
}
struct CharacterInfo{
QChar字符;
int事件;
双频;
};
std::矢量特征信息;
//一些用于填充向量的代码
for(无符号i=0;i
您可以使用STL迭代器对向量进行迭代:

for (vector<CharacterInfo>::iterator it = characterInfos.begin();
        it != characterInfos.end(); ++it) {
    it->frequency = (double)it->occurrences / totalOccurrences;
}
for(vector::iterator it=characterInfo.begin();
it!=characterInfo.end();+it){
it->frequency=(double)it->事件/总事件;
}
在循环中,
it
是一个迭代器,它的功能和接口与指向
CharacterInfo
结构的指针基本相同:


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

您可以使用参考:

CharacterInfo& info = characterInfos[i];
info.frequency = (double)info.occurrences / (double)totalOccurrences;
参考
info
绑定到向量的元素。如果你改变它,你就会改变
向量元素也一样。

我不确定我是否理解你的问题,但我想你是想这么做吗

for (unsigned i = 0; i < characterInfos.size(); i++) {
    characterInfos[i].frequency = (double)characterInfos[i].occurrences / (double)totalOccurrences;
}
for(无符号i=0;i
另一种选择是使用迭代器:

for(std::vector<CharacterInfo>::iterator it = characterInfos.begin(); it != characterInfos.end(); ++it){
    it->frequency = (double)it->occurences / (double)totalOccurences;
}
for(std::vector::iterator it=characterInfo.begin();it!=characterInfo.end();++it){
it->频率=(双)it->发生次数/(双)总发生次数;
}

最简单的方法是使用引用而不是实例,这样就不会对代码进行太多更改。因此:

SomeStruct & info = myVector[i];
下一个最简单的方法是改变使用带索引的循环,如下所示:

for (std::vector<SomeStruct>::iterator it = myVector.begin(); it != myVector.end(); ++it)
{
    SomeStruct & info = *it;
    // do stuff here
}
也与您的问题没有直接关系,但如果您向结构中添加一个计算频率的方法,代码将变得更清晰,例如,从上一个示例中可以执行以下操作:

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

如果您使用
myVector.begin()
将调用更改为
std::begin(myVector)
,并且将调用更改为end,那么在没有C++11编译器的情况下,这也可以工作。

哇,这是一个非常古老的问题。对于“较新”的C++,同样可以用

来完成。
for(自动和字符信息:字符信息){
characterInfo.frequency=characterInfo.Occurrences/静态广播(TotalOccurrences);
}
std::for_each(std::begin(myVector), std::end(myVector), std::mem_fun(&SomeStruct::calculateFrequency));
for(auto &characterInfo : characterInfos) {
    characterInfo.frequency = characterInfo.occurences / static_cast<double>(totalOccurences);
}