首页 > 解决方案 > 如何有效地混合常量和临时返回值?

问题描述

我正在尝试重新使用 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;
        }
    }
}

我想要的是我的全球西雅图和塔科马被退回,而不是副本

如何避免复制常量字符串,同时为我不知道的字符串保持相同的接口?

还是我应该不在乎?

谢谢

标签: c++

解决方案


您可以在不复制的情况下重用已知值,并通过稍微更改策略来使用为未知值构造的对象。

传递一个std::functiontofactory并调用函数 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;});
   }
}

推荐阅读