我的一个函数将vector作为参数并将其存储为成员变量.我正在使用const引用,如下所述.
class Test {
public:
void someFunction(const std::vector<string>& items) {
m_items = items;
}
private:
std::vector<string> m_items;
};
Run Code Online (Sandbox Code Playgroud)
但是,有时候items
包含大量的字符串,所以我想添加一个支持移动语义的函数(或用新的函数替换它).
我正在考虑几种方法,但我不确定选择哪一种方法.
1)unique_ptr
void someFunction(std::unique_ptr<std::vector<string>> items) {
// Also, make `m_itmes` std::unique_ptr<std::vector<string>>
m_items = std::move(items);
}
Run Code Online (Sandbox Code Playgroud)
2)按值传递并移动
void someFunction(std::vector<string> items) {
m_items = std::move(items);
}
Run Code Online (Sandbox Code Playgroud)
3)右值
void someFunction(std::vector<string>&& items) {
m_items = std::move(items);
}
Run Code Online (Sandbox Code Playgroud)
我应该避免哪种方法?为什么?
我有一个基类及其子类:
class Base {
public:
virtual void hi() {
cout << "hi" << endl;
}
};
class Derived : public Base {
public:
void hi() override {
cout << "derived hi" << endl;
}
};
Run Code Online (Sandbox Code Playgroud)
尝试创建一个辅助函数,该函数创建Derived对象的唯一指针.
1)这个工作:
std::unique_ptr<Base> GetDerived() {
return std::make_unique<Derived>();
}
Run Code Online (Sandbox Code Playgroud)
2)但是,这个无法编译:
std::unique_ptr<Base> GetDerived2() {
auto a = std::make_unique<Derived>();
return a;
}
Run Code Online (Sandbox Code Playgroud)
3)std :: move作品:
std::unique_ptr<Base> GetDerived3() {
auto a = std::make_unique<Derived>();
return std::move(a);
}
Run Code Online (Sandbox Code Playgroud)
4)如果我创建一个Base实例,两者都有效:
std::unique_ptr<Base> GetDerived4() {
auto a = std::make_unique<Base>();
return a;
}
std::unique_ptr<Base> GetDerived5() …
Run Code Online (Sandbox Code Playgroud) 是否有任何区别auto*
,并auto
当它们被用于指针?例如,
TestClass t;
auto* a = &t;
auto b = &t;
a->doSomething();
b->doSomething();
Run Code Online (Sandbox Code Playgroud)
我想知道它们是否不同。
我正在读这本书"C++之旅",并且无法理解以下段落."不同类型是不可接受的"是什么意思?那么,何时使用指针转换以及何时使用引用转换?有人可以详细说明吗?谢谢.
编辑:另一个问题," 使用带有引用和指针的dynamic_cast时的行为差异 "是询问dynamic_cast的行为,我可以理解 - 返回nullptr或抛出异常.在这个问题中,我问的是何时使用另一个以及何时使用另一个.
"当指向不同派生类的对象的指针是有效参数时,我们将dynamic_cast用于指针类型.然后我们测试结果是否为nullptr.此测试通常可以方便地放在条件中变量的初始化中.当一个不同的类型是不可接受的时,我们可以简单地dynamic_cast到一个引用类型.如果该对象不是预期的类型,则抛出bad_cast:" - C++之旅,第4.5.3节
我正在尝试使用YouTube Data API(v3)从YouTube视频中获取字幕 https://developers.google.com/youtube/v3/guides/implementation/captions
所以,首先我尝试使用此网址检索字幕列表:https://www.googleapis.com/youtube/v3/captions? part = snippet & videoId = KK9bwTlAvgo & key = {My API KEY}
我可以从上面的链接中检索我想要下载的标题ID(jEDP-pmNCIqoB8QGlXWQf4Rh3faalD_l).
然后,我按照此说明下载了标题:https: //developers.google.com/youtube/v3/docs/captions/download
但是,即使我正确输入了标题ID和我的api密钥,它也会显示"需要登录"错误.
我想我需要OAuth身份验证,但我想要做的是与用户的帐户无关,而只是自动下载公共字幕数据.
我的问题是:有没有办法只处理OAuth身份验证一次,以获取我自己的YouTube帐户的访问令牌,然后在我的应用程序中需要时重复使用它?
class TestClass {
public:
TestClass(string s) {
}
};
Run Code Online (Sandbox Code Playgroud)
当有TestClass时,我理解了emplace和insert之间的区别(插入副本时的emplace构造)
set<TestClass> test_set;
test_set.insert(TestClass("d"));
test_set.emplace("d");
Run Code Online (Sandbox Code Playgroud)
但是,如果已经存在TestClass对象,它们在机制和性能方面有何不同?
set<TestClass> test_set;
TestClass tc("e");
test_set.insert(tc);
test_set.emplace(tc);
Run Code Online (Sandbox Code Playgroud) string a = "";
string b = {};
Run Code Online (Sandbox Code Playgroud)
我无法找到解释它们之间差异的好参考.编译器有不同的看法吗?那么为什么?