由于某种原因,以下代码失败.您不能简单地使用其base()方法擦除reverse_iterator.
#include <set>
#include <iostream>
int main()
{
std::set<int> setOfInts;
setOfInts.insert(1);
setOfInts.insert(2);
setOfInts.insert(3);
std::set<int>::reverse_iterator rev_iter = setOfInts.rbegin();
std::set<int>::reverse_iterator nextRevIter = setOfInts.rbegin();
++nextIter;
while ( rev_iter != setOfInts.rend())
{
// Find 3 and try to erase
if (*rev_iter == 3)
{
// SEGFAULT HERE
setOfInts.erase( rev_iter.base());
}
rev_iter = nextRevIter;
++nextRevIter;
}
}
Run Code Online (Sandbox Code Playgroud)
如何正确地做上述事情?如果reverse_iterator对应于您想要擦除的内容,那么如何删除它?
注意,遗憾的是不会使用reverse_iterator.它想要真实的东西.
假设我有一个类,我希望用户能够引用我的一个成员.哪个更受欢迎?
class Member;
class ClassWithWeakPtr
{
private:
boost::shared_ptr<Member> _member;
public:
boost::weak_ptr<Member> GetMember();
};
Run Code Online (Sandbox Code Playgroud)
要么
class Member;
class ClassWithCppReference
{
private:
Member _member;
public:
Member& GetMember() {return _member;}
};
Run Code Online (Sandbox Code Playgroud)
你怎么看?什么时候比另一个更好?
我刚刚了解了std :: function到底是什么以及它用于什么,我有一个问题:现在我们基本上有代理,我们应该在何时何地使用抽象基类,何时我们应该实现多态性通过std :: function对象提供给泛型类?ABC在C++ 11中受到了致命打击吗?
就个人而言,到目前为止,我的经验是切换委托代码比为特定行为创建多个继承类要简单得多......所以我有点困惑abotu从现在起如何有用的Abstract Bases.
我正在审查一个同事的代码,我发现他在全球范围内定义了几个常量:
const string& SomeConstant = "This is some constant text";
Run Code Online (Sandbox Code Playgroud)
就个人而言,这对我来说闻起来很糟糕,因为引用是指我假设的是一个从给定的char数组构造的"匿名"对象.
从语法上讲,它是合法的(至少在VC++ 7中),它似乎运行,但实际上我宁愿让他删除&因此对它正在做什么没有歧义.
那么,这真的很安全合法吗?我很着迷吗?构造的临时对象是否具有保证的寿命?我一直认为以这种方式使用的匿名对象在使用后被破坏了......
所以我的问题也可以推广到匿名对象的生命周期.标准是否规定了匿名对象的生命周期?它是否与同一范围内的任何其他对象具有相同的生命周期?或者只给出表达式的生命周期?
此外,当它作为本地时,它显然有不同的范围:
class A
{
string _str;
public:
A(const string& str) :
_str(str)
{
cout << "Constructing A(" << _str << ")" << endl;
}
~A()
{
cout << "Destructing A(" << _str << ")" << endl;
}
};
void TestFun()
{
A("Outer");
cout << "Hi" << endl;
}
Run Code Online (Sandbox Code Playgroud)
显示:
构建A(外部); 破坏A(外); 你好
我正在研究一个使用互斥锁来保护全局双精度的例子,但是我得到了错误 -
Lab7.exe中0x77b6308e处的未处理异常:0xC0000005:访问冲突写入位置0x00000068.
我认为这与获得分数有关?(全球双倍)
#include <windows.h>
#include <iostream>
#include <process.h>
double score = 0.0;
HANDLE threads[10];
CRITICAL_SECTION score_mutex;
unsigned int __stdcall MyThread(void *data)
{
EnterCriticalSection(&score_mutex);
score = score + 1.0;
LeaveCriticalSection(&score_mutex);
return 0;
}
int main()
{
InitializeCriticalSection(&score_mutex);
for (int loop = 0; loop < 10; loop++)
{
threads[loop] = (HANDLE) _beginthreadex(NULL, 0, MyThread, NULL, 0, NULL);
}
WaitForMultipleObjects(10, threads, 0, INFINITE);
DeleteCriticalSection(&score_mutex);
std::cout << score;
while(true);
}
Run Code Online (Sandbox Code Playgroud)
更新:
在将循环设置为1000而不是10来解决问题之后,错误仍然存在,但是当我注释掉引用互斥锁的代码时,错误没有发生.
CRITICAL_SECTION score_mutex;
EnterCriticalSection(&score_mutex);
LeaveCriticalSection(&score_mutex);
InitializeCriticalSection(&score_mutex);
DeleteCriticalSection(&score_mutex);
Run Code Online (Sandbox Code Playgroud)
更新2
线程按照惯例返回0(这是一个漫长的一周!)
我尝试在互斥量相关的代码中添加,并且程序将编译并运行正常(除了竞争条件问题与双重当然)与CRITICAL_SECTION,InitializeCriticalSection和DeleteCriticalSection都重新加入.问题似乎与EnterCriticalSection或LeaveCriticalSection,因为我添加它时错误再次出现.
c++ winapi multithreading critical-section waitformultipleobjects
我正在按照2006年Microsoft .Net课程练习册的说明进行其中一个练习.(具体来说,本课程是MS2349B,我正在进行第4单元练习2).这些练习似乎是为Vista之前的每个人都拥有完全管理员权限而构建的.(我正在使用.net 4.0.)
此练习涉及构建强名称程序集,将其安装在GAC中,针对强名称程序集构建本地可执行文件,验证可执行文件是否运行.
根据教程,我使用#if 块来签署我的程序集:
#if STRONG
[assembly: System.Reflection.AssemblyVersion("2.0.0.0")]
[assembly: System.Reflection.AssemblyKeyFile("OrgVerKey.snk")]
#endif
Run Code Online (Sandbox Code Playgroud)
我以本地用户身份构建可执行文件:
C:\path\to\lab>csc /define:STRONG /target:library
/out:AReverser_v2.0.0.0\AReverser.dll AReverser_v2.0.0.0\AReverser.cs
C:\path\to\lab>csc /reference:MyStringer\Stringer.dll
/reference:AReverser_v2.0.0.0\AReverser.dll Client.cs
Run Code Online (Sandbox Code Playgroud)
我通过以管理员身份运行的visual studio命令提示符将其安装到GAC中:
C:\path\to\lab>gacutil /i AReverser_v2.0.0.0\AReverser.dll
Run Code Online (Sandbox Code Playgroud)
当我在管理员提示符下运行我的exe时,我得到了我期望的输出 - 应用程序运行正常并且似乎正确地从gac加载dll.当我在非管理命令提示符下运行时,我收到以下错误
Unhandled Exception: System.IO.FileLoadException: Could not load file or assembl
y 'AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b5fcbdcff229fabb'
or one of its dependencies. The located assembly's manifest definition does not
match the assembly reference. (Exception from HRESULT: 0x80131040)
at MainApp.Main()
Run Code Online (Sandbox Code Playgroud)
对我来说奇怪的是publicKeyToken与GAC中的内容不同:
AReverser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=f0548c0027634b66
Run Code Online (Sandbox Code Playgroud)
但是,如果我从GAC卸载AReverser并尝试运行我的exe作为管理员提示我收到以下错误,表明它正在寻找预期的公钥令牌f0548c0027634b66:
C:\path\to\lab>gacutil /u "AReverser,Version=2.0.0.0,Culture=neutral,
PublicKeyToken=f0548c0027634b66"
Microsoft (R) …Run Code Online (Sandbox Code Playgroud) 在C++中,您通常可以通过仔细使用"using"关键字来大幅提高代码的可读性,例如:
void foo()
{
std::vector< std::map <int, std::string> > crazyVector;
std::cout << crazyVector[0].begin()->first;
}
Run Code Online (Sandbox Code Playgroud)
变
void foo()
{
using namespace std; // limited in scope to foo
vector< map <int, string> > crazyVector;
cout << crazyVector[0].begin()->first;
}
Run Code Online (Sandbox Code Playgroud)
python是否存在类似的东西,或者我是否必须完全限定所有内容?
我将添加免责声明,我知道使用有其缺陷,应该适当限制范围.
我有以下代码:
#include "stdafx.h"
#include <iostream>
#include <conio.h>
using namespace std;
#define MNAME 30
class Person {
public:
char name[MNAME + 1];
};
class Student : public Person {
};
class Staff : public Person {
};
class Faculty : public Student, public Staff {
};
int _tmain(int argc, _TCHAR* argv[])
{
Faculty faculty;
cout << "Address of faculty.Person::name: " << &faculty.Person::name << endl;
cout << "Address of faculty.Student::name: " << &faculty.Student::name << endl;
cout << "Address of faculty.Staff::name: " << …Run Code Online (Sandbox Code Playgroud)