对于这个问题,这可能不是一个非常合适的论坛,但是让我试一试,冒着被搬走的风险.
C++标准库有几个参考,包括非常有价值的ISO标准,MSDN,IBM,cppreference和cplusplus.就个人而言,在编写C++时,我需要一个具有快速随机访问,短加载时间和使用示例的引用,并且我一直在发现cplusplus.com非常有用.但是,我一直在SO上听到关于该网站的负面看法,所以我想具体说明:
cplusplus.com提供的错误,误解或错误建议有哪些?使用它来做出编码决策有哪些风险?
让我补充一点:我希望能够通过标准的准确报价在这里回答问题,因此我想发布可立即使用的链接,而cplusplus.com将是我选择的网站,如果不是这个问题.
我有一个IInventory*的向量,我正在使用C++ 11范围循环遍历列表,以便对每个进行处理.
在做了一些东西之后,我可能想要从列表中删除它并删除对象.我知道我可以随时调用delete指针来清理它,但是在范围for循环中,从矢量中删除它的正确方法是什么?如果我从列表中删除它将使我的循环失效?
std::vector<IInventory*> inv;
inv.push_back(new Foo());
inv.push_back(new Bar());
for (IInventory* index : inv)
{
// Do some stuff
// OK, I decided I need to remove this object from 'inv'...
}
Run Code Online (Sandbox Code Playgroud) 如何从中删除第i项std::vector?
我知道我想删除第i个元素.我int i; and std::vector<process> pList;在那里process是一个结构.我想做一些与以下相同的事情:
pList.remove(i);
Run Code Online (Sandbox Code Playgroud) 我有一个stl::vector<int>,我需要删除给定索引处的所有元素(向量通常具有高维度).我想知道,考虑到原始矢量的顺序应该保留,这是进行这种操作的最有效方法.
虽然,我在这个问题上发现了相关的帖子,但有些人需要删除一个单元素或多个元素,其中删除 - 删除成语似乎是一个很好的解决方案.但是,在我的情况下,我需要删除多个元素,因为我使用的是索引而不是直接值,remove-erase idiom所以无法应用,对吧?我的代码如下所示,我想知道在效率方面是否可以做得更好?
bool find_element(const vector<int> & vMyVect, int nElem){
return (std::find(vMyVect.begin(), vMyVect.end(), nElem)!=vMyVect.end()) ? true : false;
}
void remove_elements(){
srand ( time(NULL) );
int nSize = 20;
std::vector<int> vMyValues;
for(int i = 0; i < nSize; ++i){
vMyValues.push_back(i);
}
int nRandIdx;
std::vector<int> vMyIndexes;
for(int i = 0; i < 6; ++i){
nRandIdx = rand() % nSize;
vMyIndexes.push_back(nRandIdx);
}
std::vector<int> vMyResult;
for(int i=0; i < (int)vMyValues.size(); i++){ …Run Code Online (Sandbox Code Playgroud) 我发现自己写了很多东西:
int location =2;
vector<int> vec;
vector<int>::iterator it=vec.begin();
/..../
std::advance(it, location);
Run Code Online (Sandbox Code Playgroud)
代替
it= it + 5;
Run Code Online (Sandbox Code Playgroud)
什么是首选/推荐方式?
我有一个a存储值[0 1 2 3 5]和其他向量的向量removelist存储要删除的索引[0 1 2],以便[3 5]最后离开.当我实现以下代码时,它会意外删除项目,因为向量a将在此过程中更改顺序.我有什么方法可以实现我的目标吗?
for (int i = 0; i<removelist.size() ; i++)
a.erase(a.begin() + removelist[i]);
Run Code Online (Sandbox Code Playgroud) 我有一个包含STL向量的对象.我从矢量大小为零开始,并使用push_back它来添加它.所以,push_back工作正常.
在我的代码中,向量中的每个元素代表一个原子.因此,该STL载体在其内部的对象是"分子".
当我试图从我的分子中移除一个原子,即从阵列中擦除其中一个元素时,该erase()功能不起作用.其他方法可以工作,如size()和clear().clear()删除所有元素,这是过度的.erase()正是我想要的,但由于某种原因它不起作用.
这是我的代码的一个非常简化的版本.但是,它确实代表了问题.
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std;
class atomInfo
{
/* real code has more variables and methods */
public:
atomInfo () {} ;
};
class molInfo
{
/* There is more than 1 atom per molecule */
/* real code has more variables and methods */
public:
vector <atomInfo> atom;
molInfo () {};
};
int main () …Run Code Online (Sandbox Code Playgroud) 我发现了PHP的相同问题,我试图在C++中做同样的事情.
我试过以下:
// returns new array with numbers lower then "number", len is set to
// new length.
int * filter(int array[], int &len, int number) {
int cnt = 0;
for (int i = 0; i < len; i++) {
if (array[i] < number) {
cnt++;
}
}
int *ret = new int[cnt];
cnt = 0;
for (int i = 0; i < len; i++) {
if (array[i] < number) {
ret[cnt] = array[i];
cnt++;
}
}
len = …Run Code Online (Sandbox Code Playgroud) 我在C++中有以下代码:
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <vector>
int main ()
{
srand(time(0));
int noOfElements = 9;
for (int a = 0; a < 9; a++)
{
std::vector<int> poss;
for (int a = 1; a <= 9; a++)
poss.push_back(a);
for (int b = 0; b < 9; b++)
{
int random = rand() % 9;
std::cout << poss[random];
poss.erase(random);
noOfElements--;
}
std::cout << "\n";
}
}
Run Code Online (Sandbox Code Playgroud)
然而,当我运行它时,它会返回:
error: no matching function for call to 'std::vector<int>::erase(int&)'
Run Code Online (Sandbox Code Playgroud)
对于第13行.
为什么这样,我该如何纠正呢?
要从矢量中删除元素,我们可以使用
v.erase(v.begin() + 1); // remove 2nd
Run Code Online (Sandbox Code Playgroud)
此外,我在本网站(SO)的一些帖子中找到了如下句子(例如这个).
v.erase(&v[1]);
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试使用第二句时,编译器说"错误:没有用于调用std :: vector的匹配函数"...
第二句只能在某些有限的环境中使用吗?