我在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?
}
答案 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);
}