c++ - 如何有效地混合常量和临时返回值?
问题描述
我正在尝试重新使用 C++,但它在 20 年内发生了一些变化
我正在处理一个包含一堆字符串的网络流。
我知道这些字符串中的绝大多数可能是什么,但不是全部
如果我知道所有字符串可能是什么,我会将这些字符串映射到一个枚举,以便比较便宜,并且内存中不会有数百万个重复的字符串
因为我知道大多数字符串可能是什么,我想我会创建一个包含一堆 const std::strings 的文件并动态创建我不知道的字符串。但是,我似乎是在复制 const std::string 而不是直接链接到它们
我写了一个愚蠢的程序来演示。
我使用了下面的城市。我知道西雅图和塔科马,但不知道随机城市。
#include <algorithm>
#include <iostream>
#include <random>
const std::string SEATTLE("Seattle");
const std::string TACOMA("Tacoma");
std::random_device rd;
std::mt19937 gen(rd());
std::uniform_int_distribution<int> dist(0, 'Z' - 'A');
auto next = []() -> char {
return static_cast<char>('A' + dist(gen));
};
const std::string factory(int in) {
switch (in) {
case 0: {
return SEATTLE;
}
case 1: {
return TACOMA;
}
default: {
std::string retval(5, 0);
std::generate_n(retval.begin(), 5, next);
return retval;
}
}
}
int main(int argc, char **argv) {
std::cout << "SEATTLE=" << &SEATTLE << std::endl;
std::cout << "TACOMA=" << &TACOMA << std::endl;
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
const std::string value = factory(i);
std::cout << "i=" << i << " " << value << " " << &value << std::endl;
}
}
}
我想要的是我的全球西雅图和塔科马被退回,而不是副本
如何避免复制常量字符串,同时为我不知道的字符串保持相同的接口?
还是我应该不在乎?
谢谢
解决方案
您可以在不复制的情况下重用已知值,并通过稍微更改策略来使用为未知值构造的对象。
传递一个std::function
tofactory
并调用函数 from factory
。
void factory(int in, std::function<void(std::string const&)> f) {
switch (in) {
case 0:
// SEATTLE is passed by reference. No need for copy.
f(SEATTLE);
case 1:
// TACOMA is passed by reference. No need for copy.
f(TACOMA);
default:
// Construct a new object for unknown values.
std::string retval(5, 0);
std::generate_n(retval.begin(), 5, next);
f(retval);
}
}
并将其main
用作:
for (int i = 0; i < 4; ++i) {
for (int j = 0; j < 4; ++j) {
factory(i,
[=](std::string const& value) { std::cout << "i=" << i << " " << value << " " << &value << std::endl;});
}
}
推荐阅读
- python - 如何使用自动生成的数据框名称在 for 循环中创建数据框
- python - 从包含“exp”而不是值数组的表达式中只返回一个值
- ios - 如何在 swift 的 for 循环中显示多个警报控制器
- c - 从标准输入读取整数到数组
- c - 将字符串与数组进行比较,但它给了我一个错误
- data-science - 当所有数据都是数字时,如何计算 CART 算法的基尼指数?
- javascript - jquery弹出窗口成功但传递参数失败
- c++ - 在 cpp 项目中包含的标头中声明 cuda 变量
- javascript - Firebase 模拟器错误:通道凭据必须是 ChannelCredentials 对象
- node.js - Mocha/Chai 测试失败,因为 oracledb 节点模块耗时太长