- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试使用容器(例如 vector 、集合等)提取元素,但我没有使用索引,而是使用了位掩码技术。
vector<string> alphabets {"a", "b", "c", "d", "e"};
输入:5
(等效位掩码:00101
)
输出:新 vector {"c", "e"}
输入13
(位掩码:01101
)
输出 vector :{"b", "c", "e"}
vector<string*> extract(int mask){
vector<string*> result;
bitset<n> bits(mask);
for (int j = 0; j < n; ++j) {
if (bits[j]){
result.push_back(&alphabets[j]);
}
}
}
排列 a,b,c,d,e 的所有组合,其中 a,b,c,d,e 包裹在一个容器上。 (其他方法已在 Generating combinations in c++ 问题中提及。)
#include <vector>
#include <iostream>
#include <algorithm>
#include <string>
#include <bitset>
using namespace std;
int main(){
const int n = 5;
vector<string> alphabets {"a", "b", "c", "d", "e"};
for ( int i = 0; i < pow(2, n); ++i){
vector<string*> result;
bitset<n> bits(i);
for (int j = 0; j < n; ++j) {
if (bits[j]){
result.push_back(&alphabets[j]);
}
}
for (auto r: result){
cout << *r;
}
cout << endl;
}
return 0;
}
最佳答案
如果您更看重性能而不是可读性,我认为这是一个合理的起点。
基本上我避免了任何内存分配。
#include <string>
#include <vector>
#include <bitset>
#include <iostream>
#include <iterator>
#include <tuple>
#include <array>
template<class From, std::size_t N>
auto
select(From const& from, std::bitset<N> const& bits)
{
std::array<const std::string*, N> result { nullptr };
auto i = std::begin(result);
std::size_t found;
std::size_t count = found = bits.count();
std::size_t index = 0;
while (count)
{
if (bits.test(index)) {
*i++ = &from[index];
--count;
}
++index;
}
return std::make_tuple(found, result);
}
int main()
{
std::vector<std::string> alphabet = { "a", "b", "c", "d", "e", "f", "g", "h" };
for (unsigned x = 0 ; x < 256 ; ++x)
{
auto info = select(alphabet, std::bitset<8>(x));
auto ptrs = std::get<1>(info).data();
auto size = std::get<0>(info);
while(size--)
{
std::cout << *(*ptrs++) << ", ";
}
std::cout << '\n';
}
}
这里我在编译时预先计算所有可能的字母表。
运行时间当然快得令人眼花缭乱。然而,超过 14 个字符的字母表可能需要一段时间才能编译...
更新:警告!当我将字母大小设置为 16 clang 以消耗 32GB 内存时,停止了桌面上的所有其他应用程序并需要重新启动我的 macbook,然后才能做任何其他事情。您已收到警告。
#include <string>
#include <vector>
#include <bitset>
#include <iostream>
#include <iterator>
#include <tuple>
#include <array>
template<class From, std::size_t N>
auto
select(From const& from, std::bitset<N> const& bits)
{
std::array<const std::string*, N> result { nullptr };
auto i = std::begin(result);
std::size_t found;
std::size_t count = found = bits.count();
std::size_t index = 0;
while (count)
{
if (bits.test(index)) {
*i++ = &from[index];
--count;
}
++index;
}
return std::make_tuple(found, result);
}
template<std::size_t Limit>
struct alphabet
{
constexpr alphabet(std::size_t mask)
: size(0)
, data { }
{
for (std::size_t i = 0 ; i < Limit ; ++i)
{
if (mask & (1 << i))
data[size++] = char('a' + i);
}
}
std::size_t size;
char data[Limit];
friend decltype(auto) operator<<(std::ostream& os, alphabet const& a)
{
auto sep = "";
for (std::size_t i = 0 ; i < a.size; ++i)
{
std::cout << sep << a.data[i];
sep = ", ";
}
return os;
}
};
template<std::size_t Limit>
constexpr alphabet<Limit> make_iteration(std::size_t mask)
{
alphabet<Limit> result { mask };
return result;
}
template<std::size_t Limit, std::size_t...Is>
constexpr auto make_iterations(std::index_sequence<Is...>)
{
constexpr auto result_space_size = sizeof...(Is);
std::array<alphabet<Limit>, result_space_size> result
{
make_iteration<Limit>(Is)...
};
return result;
}
template<std::size_t Limit>
constexpr auto make_iterations()
{
return make_iterations<Limit>(std::make_index_sequence<std::size_t(1 << Limit) - 1>());
}
int main()
{
static constexpr auto alphabets = make_iterations<8>();
for(const auto& alphabet : alphabets)
{
std::cout << alphabet << std::endl;
}
}
使用一个非常基本的固定容量指针容器来匹配元素。我添加了 constexpr。这不会改善大多数情况,但肯定会改善静态分配的选择。
#include <vector>
#include <bitset>
#include <iostream>
#include <iterator>
#include <tuple>
#include <array>
namespace quick_and_dirty {
template<class T, std::size_t Capacity>
struct fixed_capacity_vector
{
using value_type = T;
constexpr fixed_capacity_vector()
: store_()
, size_(0)
{}
constexpr auto push_back(value_type v)
{
store_[size_] = std::move(v);
++ size_;
}
constexpr auto begin() const { return store_.begin(); }
constexpr auto end() const { return begin() + size_; }
private:
std::array<T, Capacity> store_;
std::size_t size_;
};
} // namespace quick_and_dirty
template<class From, std::size_t N>
constexpr
auto
select(From const& from, std::bitset<N> const& bits)
{
using value_type = typename From::value_type;
using ptr_type = std::add_pointer_t<std::add_const_t<value_type>>;
auto result = quick_and_dirty::fixed_capacity_vector<ptr_type, N>();
std::size_t count = bits.count();
for (std::size_t index = 0 ; count ; ++index)
{
if (bits.test(index)) {
result.push_back(&from[index]);
--count;
}
}
return result;
}
int main()
{
std::vector<std::string> alphabet = { "a", "b", "c", "d", "e", "f", "g", "h" };
for (unsigned x = 0 ; x < 256 ; ++x)
{
for(auto p : select(alphabet, std::bitset<8>(x)))
{
std::cout << (*p) << ", ";
}
std::cout << '\n';
}
}
关于c++ - 用于选择 vector/集合元素的位掩码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39083189/
编辑:我似乎问错了这个问题。 我正在尝试寻找一种方法来查询一个集合是否在另一个集合中可用。例如: SELECT * FROM something WHERE (1, 3) IN (1, 2, 3, 4
这两种方法似乎 produce the same results ,但我一直很难真正说服人们第二种方法有效,因为它显然并不为人所知。 // Create some data var foo = { '
我一直在学习Kotlin,并且遇到过Collections API。在Kotlin之前,我一直在学习Java,并且我知道Java中有很多不同类型的Collections API。例如,我们使用List
为什么我会得到不同的行为: Collection col2 = new ArrayList(col); 集合 col2 = new ArrayList(); col2.addAll(col) 我正在与
所以我有一个代表专辑信息的 JSON 对象。给定“function updateRecords(id, prop, value)”我希望能够更新每个条目。正确的完成代码如下。 我得到了指示,粗体部分,
我想存储一个对象集合,这些对象根据它们所代表的值进行键控。这些键可以重复。例如: [4] => Bob [5] => Mary [5] => Sue [9] => Steve [10] =>
在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。 确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递: public ArrayList(
我正在为 API 编写一个 swagger 定义文件。 API 是用于 GET 请求的 /path/to/my/api: get: summary: My Custom API d
我知道scala.collection包中有两个非常有用的对象,可以帮助我们实现这个目标: JavaConverters(如果我想明确说明并准确说明我要转换的内容) JavaConversions(如
我已经阅读了无数其他帖子,但似乎无法弄清楚发生了什么,所以是时候寻求帮助了。 我正在尝试将包含集合的域实体映射到也包含集合的 dtos。 这是一个原始示例; (我提前为代码墙道歉,我尽量保持简短):
我正在创建一个具有 ArrayList 的类,因此当我调用构造函数时,它会初始化该数组: public class ElementsList { private ArrayList list;
我正在阅读事件指南和指南的开头,它说: You can also add an event listener to any element in the this.$ collection using
我是 Python 新手,想知道如何使用键在字典中存储不同数据类型的列表 例如 - {[Key1,int1,int1,String1] , [Key2,int2,int2,String2], [Key
int[] mylist = { 2, 4, 5 }; IEnumerable list1 = mylist; list1.ToList().Add(1); // why 1 does not get
我在 UI 表单中的每一行之后将以下内容添加到 HashMap 集合中 声明 Map> map = new HashMap>(); List valSetOne = new ArrayList();
我正在开发我的第一个 Java 项目,我有一个问题。问题应该很简单(虽然代码不是那么短,但没有理由被吓倒:))。我创建了一个基本的角色扮演游戏,并且有一个定义每个角色的抽象类“Character”。在
我正在开发一款应用程序,可以为用户收集推文、Facebook 状态和 Facebook 照片。目前,用户确切地设定了他们希望这种收获发生的时间和时间,并且蜘蛛会在此期间拉取数据。 when 和 to
有谁知道在 C# 中是否有与 Java 的 Set 集合等效的好方法?我知道您可以通过填充但忽略值来使用 Dictionary 或 HashTable 在某种程度上模仿集合,但这不是一种非常优雅的方式
EXISTS 该函数返回 集合中第一个元素的索引,如果集合为空,返回NULLNULLNULL Collecti
RDF集合是通过属性 rdf:parseType="Collection" 来描述仅包含指定成员的组 rdf:parseType="Collection" 属
我是一名优秀的程序员,十分优秀!